Maintainer guide
You're here to change the code. This page is the shortest path from "clean clone" to "PR merged" plus the invariants that are load-bearing enough that CI can't always catch you breaking them.
Read CLAUDE.md
and CONTRIBUTING.md
first. They are the source of truth for test/lint conventions and PR titles.
This page is documentation over the top of them, not a replacement.
Repository layout
Hyveon/
├── package.json # npm-workspaces ROOT — `npm run` scripts fan out from here
├── tsconfig.base.json # shared TS config
├── scripts/ # @hyveon/scripts — init-parent.ts submodule scaffolder
├── build/ # icon source art (icon.svg, icon-small.svg) + generate-icons.mjs
├── electron.vite.config.ts # electron-vite build config (main/preload/renderer pipelines)
├── electron-builder.yml # packaged-installer config (NSIS/DMG/AppImage)
├── openspec/ # OpenSpec change proposals/specs for this repo
├── app/ # @hyveon/app — Electron desktop app workspace
│ ├── eslint.config.js # flat config; recommended TS + React presets
│ ├── vitest.config.ts
│ └── packages/
│ ├── shared/ # @hyveon/shared — pure TS + DDB/Secrets helpers
│ ├── cloud-aws/ # @hyveon/cloud-aws — AWS impl of the cloud-agnostic contracts
│ ├── desktop-main/ # @hyveon/desktop-main — Nest.js IPC microservice
│ ├── desktop-preload/ # @hyveon/desktop-preload — contextBridge preload script
│ ├── web/ # @hyveon/web — React + Vite dashboard renderer
│ └── lambda/
│ ├── interactions/ # esbuild → dist/handler.cjs
│ ├── followup/
│ ├── update-dns/
│ ├── watchdog/
│ └── efs-seeder/ # conditional, one function per game with file_seeds
├── terraform/ # root composer: backend/providers + module "cloud"
│ ├── main.tf variables.tf outputs.tf moved.tf
│ ├── terraform.tfvars.example
│ └── aws/ # all AWS infra (the "cloud" module)
│ ├── main.tf route53.tf watchdog.tf interactions.tf followup.tf