personal site with 5000 other random things.
Hybrid Rust (Cargo workspace) + TypeScript (React 19) monorepo. The frontend runs on TanStack Start/Router/Query + Tailwind CSS v4 + Zustand, bundled with Vite 8 (rolldown) and deployed to Cloudflare Workers. The Rust libsadancore crate compiles to WASM and links into the frontend as @sadan4/libsadancore.
- pnpm (Node 24, see
.nvmrc) — package manager, enforced viapackageManager. - Rust nightly (
rust-toolchain.toml, edition 2024). - A Nix flake + direnv provide the full dev shell (emscripten, wasm-bindgen, mold, clang).
direnv allowto enter it.
cargo xtask run clientThe frontend depends on the WASM crate being built first, so build through xtask, not plain pnpm build:
cargo xtask build client # builds the WASM crate then the frontendcargo xtask must be run from the workspace root. Other targets: cargo xtask {build|run|gen|clean|package} {client|server|extension}.
- Rust:
cargo nextest run --all-targets --all-features(nextest, notcargo test).
No ESLint or Prettier. Linting is oxlint + stylelint for JS/TS/CSS and clippy for Rust; formatting is enforced by oxlint / rustfmt.
pnpm lint # tsc -b + stylelint + oxlint (concurrent)
pnpm lint:js:fix # oxlint --fix
cargo clippy --all-targets --all-featuresPush to the web branch (the production branch, not main) triggers the Cloudflare Workers deploy workflow. Manual deploy: pnpm run deploy (wrangler). Regen worker types with pnpm typegen.
src/— frontend:components/(incl.components/layout/),routes/(TanStack file-based routing;routeTree.gen.tsis generated — don't edit),stores/(Zustand),hooks/,utils/. Import alias@/*→./src/*.crates/— Rust workspace (libsadancore→ WASM, plus reporter, LSP, pretty-printer, AST parsers).packages/— pnpm workspace packages (e.g.VencordCompanion).