Project Overview

kaspar.dev

Personal site for Kaspar Kliimask, a backend-focused full-stack engineer based in Tartu, Estonia. A dependency-free static site with a dark, dense, futuristic design — no build step, no frameworks.

Purpose

A personal portfolio/CV site served at kliimask.ee, built as a dependency-free static site with no build step and no frameworks.

Features

Core capabilities as described in the project README.

Bilingual Content

Served as separate pages for SEO: English at /, Estonian at /et/, cross-linked with hreflang. A nav switcher toggles language and remembers the choice in localStorage; returning Estonian-preference visitors are redirected from / to /et/.

AI Usage Widget

An #ai-usage section renders a terminal-styled card with a daily token-activity heatmap and headline stats for AI-assisted coding (Claude Code + Codex). It reads a baked data/ai-usage.json — there is no runtime API.

Interactive Chrome

main.js drives scroll reveals, a lightbox, and a GitHub contribution-chart fallback, shared across both language versions of the site.

Deploy-time Safeguards

A guarded staging deploy script applies its own noindex robots rules and response headers so staging is never indexed. .assetsignore keeps deployment-only sources out of manual production uploads.

Tech Stack

From the README and repository config.

Layer Technology
Markup / Styling Static HTML + single shared styles.css, no build tooling
Behavior Vanilla JS (main.js) — scroll reveals, lightbox, chart fallback
AI usage data pipeline ccusage + scripts/transform-ai-usage.mjs (Node)
Deployment Cloudflare Pages via Git integration (prod) and Wrangler CLI (staging)
Automation macOS launchd job for scheduled AI-usage data refresh

Structure

Top-level layout, from the README.

index.html        markup (English, canonical /)
et/index.html     Estonian translation (served at /et/)
styles.css        all styles (shared)
main.js           scroll reveals, lightbox, GitHub-chart fallback (shared)
assets/           images (timeline infographic, galaxy viz, ...)
insights/         blog/insights content (planned)
data/             baked ai-usage.json
scripts/          build-ai-usage.sh, deploy-staging.sh, transform-ai-usage.mjs

Main Commands

From the README's local preview, build, and deploy steps.

# Local preview
python3 -m http.server 8000        # → http://localhost:8000

# Regenerate AI usage widget data
./scripts/build-ai-usage.sh          # rewrite data/ai-usage.json only
./scripts/build-ai-usage.sh --commit # rewrite, then commit + push if changed

# Staging deploy (guarded, adds noindex)
./scripts/deploy-staging.sh

# Manual production deploy (exceptional use only)
npx wrangler pages deploy . --project-name personal-cv --branch master --commit-dirty true

No package manifest, test runner, or CI pipeline was found in the repository — those sections are omitted rather than assumed.

Languages

Bilingual maintenance rule from the README.

When editing content, both index.html and et/index.html must be updated to stay in sync. styles.css and main.js are single-sourced — et/index.html references them with root-absolute paths (/styles.css, /assets/...), while index.html uses relative ./ paths.

Deployment

Per the README's deploy notes.

Roadmap

Open items from the README's roadmap checklist.