Technology stack

Every technology the app uses, and the reason it was chosen. The philosophy is deliberate minimalism: few dependencies, native where possible, and a single runtime (Bun) for everything. The app is self-contained: every configuration file, stylesheet and dependency it needs lives in its own folder.

The runtime: Bun

Bun is the JavaScript runtime, the package manager, the bundler, the test runner and the script runner. One tool replaces Node.js, npm, Vite and a test framework. The version is pinned with "packageManager": "bun@1.4.0" in package.json, and bunfig.toml holds the app's own Bun settings (install policy and test behaviour).

Two Bun features matter especially here:

The language: TypeScript

Everything is TypeScript with the strictest practical settings, all in the app's own tsconfig.json: strict, noUncheckedIndexedAccess, noUnusedLocals, noUnusedParameters, verbatimModuleSyntax, and jsxImportSource: "hono/jsx/dom". Bundler module resolution is used because Bun is the bundler. Type checking happens through oxlint in type-aware mode; typescript and @types/bun are declared as dev dependencies for editors and standalone type checks.

The UI runtime: hono/jsx

There is no React and no framework. The DOM is rendered with hono/jsx, the tiny JSX runtime that ships with Hono:

Validation: valibot

Valibot is the schema library. Every boundary between "unknown data" and "trusted data" is a valibot schema with a parse* helper that runs safeParse once. The parsed output type is the single source of truth, and nothing is ever as-cast after parsing. Why this is a core value of the app is its own page: Validation.

Styling: Tailwind CSS v4, in-app

Internationalization: Paraglide JS

Paraglide JS compiles messages/en.json and messages/sr-Latn-RS.json into typed message functions under the gitignored src/paraglide/. The app's own paraglide.config.ts configures the compile, with the locale stored in localStorage and never appearing in the URL. Details are in Internationalization.

The build pipeline (no Vite)

bun run i18n            paraglide compile -> src/paraglide/
bun build client.tsx    -> dist/assets/client.js   (bun build, minified)
tailwindcss -i style.css-> dist/assets/index.css   (Tailwind v4 CLI)
assemble-dist.ts        -> dist/index.html + public/* + dist/docs/*

Code quality tooling

Both linters are ordinary dev dependencies of this app, pinned like every other dependency.

The dependency list, annotated

Runtime dependencies:

PackageWhy
honoserver + JSX runtime
valibotall schema validation
tailwindcss + @tailwindcss/cliCSS compilation
lucidea couple of icons (code export, trash)

Dev dependencies: @inlang/paraglide-js (i18n compile), @types/bun + typescript (types and tooling), oxfmt + oxlint (format and lint). That is the entire list.

Next: App shell and routing.