This guide explains how to work inside DevHolm without breaking the upgrade model.
DevHolm is designed so framework updates land in the framework layer, while your site continues to live in site-owned paths.
Use this split:
src/core/is framework-owned.src/user/is site-owned.src/app/should stay thin and routing-focused.devholm.config.tsis the contract between framework and site.
If you need a new capability for a site, the first question should be: should DevHolm expose a new seam for this?
These are the files DevHolm can safely evolve upstream:
src/core/**- most of
src/app/** - framework scripts such as
scripts/devholm-cli.ts - shared database and seed wiring such as
knexfile.js
Avoid editing these directly for site-specific behavior.
These are the places a downstream site should customize:
devholm.config.tssrc/user/content/**src/user/extensions/**src/user/views/**src/user/extensions/db/migrations/**src/user/extensions/db/seeds/**
If a site feature requires custom admin UI, custom API endpoints, custom migrations, or custom seeds, it should land here.
Typical daily loop:
pnpm install
pnpm db:setup
pnpm seed:admin
pnpm devUseful validation commands:
pnpm typecheck
pnpm test
pnpm buildDevHolm separates seeds into explicit buckets:
bootstrapseeds: framework-required baseline recordsdemoseeds: optional sample contentuserseeds: site-owned content or operational data
Relevant commands:
pnpm db:migrate
pnpm db:seed
pnpm db:seed:bootstrap
pnpm db:seed:demo
pnpm db:seed:user
pnpm db:setupGuidance:
- Put framework-required records in
src/core/db/seeds/bootstrap/. - Put generic sample content in
src/core/db/seeds/demo/. - Put real site data or operational site seeds in
src/user/extensions/db/seeds/.
DevHolm supports several safe extension surfaces.
Use src/user/content/ for About, Home, Now, and similar typed content.
Use slots when you need to inject small UI pieces into core views without taking over the full page.
Start by finding available slots:
pnpm devholm list:slotsUse ejected views only when a slot is not enough.
pnpm devholm eject aboutOnce ejected, the view becomes site-owned and no longer auto-tracks upstream changes.
Put custom admin navigation and pages under src/user/extensions/admin/.
Put custom API handlers under src/user/extensions/api/ and register them through the extension registry.
Put site migrations and seeds under src/user/extensions/db/.
DevHolm ships with a CLI for common site tasks:
pnpm devholm status
pnpm devholm list:slots
pnpm devholm eject <view>
pnpm devholm new:extension <name>
pnpm devholm new:migration <name>
pnpm devholm new:seed <name>Use the CLI to stay inside the framework conventions instead of inventing custom file shapes.
Use this test:
- If the behavior should exist for every DevHolm site, it belongs in DevHolm.
- If the behavior is specific to one site, it belongs in
src/user/. - If a site-specific feature currently requires patching framework files, DevHolm probably needs a new extension seam.
To keep downstream upgrades boring:
- do not put site business logic in
src/core/ - do not put site routing mechanics directly into
src/app/when an extension seam should exist - do not store real site data in core demo seeds
- prefer
src/user/registrations over framework patches - keep
devholm.config.tsas the place where site wiring happens
The production workflow is GitHub Actions driven.
- GitHub Actions builds and publishes the Docker image.
- The deploy job generates
docker-compose.override.ymlfrom repository secrets. - The server runs the app container and points it at the host PostgreSQL instance.
Read these before first deployment:
The deploy workflow expects these repository secrets:
PROJECT_NAMESITE_URLSITE_NAMEDEPLOY_HOSTDEPLOY_USERDEPLOY_KEYDEPLOY_PATHPOSTGRES_USERPOSTGRES_PASSWORDPOSTGRES_DBNEXTAUTH_SECRETADMIN_EMAILADMIN_PASSWORD
Optional:
APP_PORTCSRF_SECRET
Important note:
- The workflow uses
NEXTAUTH_SECRETand also maps it intoAUTH_SECRETinside the generated production compose override.
- Read Quick Start.
- Read Architecture.
- Read Configuration.
- Read Extensions.
- Read GitHub Secrets and Deployment if you are touching CI/CD.