Changelog - 2026-10-20
ARDOR ships a VULCAN preset
New FeatureIn one line. vulcan init --preset ardor creates a monorepo with a working ARDOR admin, and vulcan add --preset ardor adds one to a monorepo you already have (VULCAN 0.3.0 or newer).
What changed
- Initialize a monorepo.
bun x @venizia/vulcan init --preset ardorcreates a monorepo with one ARDOR admin (Vite and React, the REST data provider, no sign-in). It runs the app's typecheck, lint, test and compile, thenvulcan doctor. - Add to an existing monorepo.
bun x @venizia/vulcan add --preset ardoradds an admin (for example next to an IGNIS app), asks which backend to proxy/apito, keeps the monorepo's IGNIS versions, and refuses, naming both versions, when the catalog pins an IGNIS outside the supported range. - A styled first page. The app shows the ARDOR logo, its name and the answer of the backend's
GET /api/helloin one card, with a placeholder while loading and, when the backend is down, one line with the command that starts it. The call uses the data provider'ssend. Tailwind CSS v4 and shadcn-style components (copied tosrc/components/shadcn/) give a light and a dark theme that follow the system. To add more components with the shadcn CLI, runbunx shadcn initfirst, which writes its owncomponents.json. - Quiet first run.
bun run server:devandbun run compileprint no Vite loader or chunk-size warnings. The config file isvite.config.mts. - One set of scripts.
server:dev,compile,typecheck(bun check),lint,lint:fix,testandclean. See Every app has the same scripts. #srcimports. The app imports its own modules as#src/pages/..., resolved by theimportsfield of itspackage.json, with no Vite alias and no tsconfigpaths(needs VULCAN 0.3.4 or newer).- No formatter config.
devz lintformats withbun fmtin the style of thebunfig.tomlat the monorepo root (single quotes, width 100, no parentheses around a single arrow parameter), and.configs/lints/.ignoreand.configs/formatters/.ignorelist the files to skip, one gitignore-style pattern per line. - A tidy root. The app root holds only
.configs,src,package.json,tsconfig.jsonand.env.example.index.htmlis insrc/..env.examplelistsPORTandAPI_URL(the backend that/apiis forwarded to). Copy it to.envto change them on your machine; an empty value keeps the default. - A Dockerfile.
.configs/builders/Dockerfilebuilds the app in three stages (install, compile, serve). nginx servesdist/on port 8080, answers every route that is not a file withindex.html, and sends/apitoAPI_UPSTREAM(defaulthttp://api:3000). Build it from the monorepo root:docker build -f apps/web/.configs/builders/Dockerfile .. - An image that starts without its backend. nginx looks
API_UPSTREAMup for each request, so the page loads and/apianswers502until the backend resolves.API_UPSTREAMis an origin, with no path, resolved by DNS: a compose or cluster service name and an IP address work, a name fromdocker run --add-hostdoes not. - A real commit, or no image. The build stops unless
APP_BUILD_COMMITis a sha of at least seven lowercase hex digits. Pass the output ofgit rev-parse HEADfrom a repository that has a commit. - Guide. Create a project.
Who is affected
- Existing applications. Nothing in the runtime API changed, and an app already generated from the preset keeps working. To follow the new layout, copy the files you want from a newly generated app. In short:
- Rename
vite.config.tstovite.config.mts(updateincludeintsconfig.json) and copy thebuildblock of the new one. - Add the
importsfield topackage.json, replace@/with#src/in your imports, and remove the alias and thepathsentry. - Set
typechecktobun check --no-pretty -p tsconfig.json;typescriptstays a dev dependency for the editor and the build config. - Move
index.htmltosrc/, setroot: 'src'in the Vite config, and copy the Dockerfile (with itsENVlines), the nginx template (itsresolverandsetlines make the image start without its backend), theAPI_URLlines of.env.exampleand of the Vite config, and the two.ignorefiles. - Delete
.configs/formatters/oxfmt.config.mtsand theoxfmtentry of itspackage.json, then rundevz lint --fixonce (it reformats(x) => x). This needs VULCAN 0.3.12 or newer and@venizia/dev-configs0.4.0 or newer. A project's own.oxfmtrc.json,.oxfmtrc.jsoncoroxfmt.config.tsoverrides thebunfig.toml; remove it to follow the root file.
- Rename
- A new app. It has all of this. It needs VULCAN 0.3.12 or newer and
@venizia/dev-configs0.4.0 or newer. - A pipeline that builds the image. Any
APP_BUILD_COMMITthat is not a sha now stops the build.