مهندسی

Reproducible builds

flake.nix pins Gleam, Erlang, and tooling. nix develop gives the same shell everywhere. CI and local machines run the same checks. No "works on my laptop" for something this small.

Type safety

Shared Language, Frontmatter, and API types cross package boundaries. Route tables are data, not convention. Metadata is a value type rendered by one layout — not strings copied across templates.

Content validation

Translation pairing, draft guards, broken internal links, and CMS schema compatibility are build failures in strict mode. Authors see warnings locally; production never ships inconsistent bilingual output.

Accessibility

Semantic landmarks, skip links, visible focus, correct lang and dir, reduced-motion respect, and forms that work without JavaScript. Persian typography gets its own measure and line-height — not a mirrored English layout.

Performance

Pre-rendered HTML. One CSS file. Deferred scripts under 3 KB combined. Search index fetched on first keystroke, not on every page load. Excellent cache behaviour by default.

Bilingual correctness

URLs are explicit (/en, /fa). hreflang alternates on every page. Separate Atom and RSS feeds per language. Search indices normalise Persian character variants.

Operational simplicity

PostgreSQL for one table. Plain SQL files. Docker for packaging. Structured logs. Graceful shutdown. Admin endpoints off unless configured.

Git-based publishing

Content changes are commits. History is blame. Rollback is git revert. The CMS is an editor, not a second platform to operate.

Over-engineering, on purpose

Most personal sites do not need Nix, Squirrel, translation validators, or ADRs. This one does — because the goal is not "a website that looks fine." The goal is a system you can inspect, trust, and keep.