Skip to content

Under developmentMica is experimental at v0.2.0 and not ready for production.Follow the releases.

Changelog

What changed, and why.

Mica releases all packages and the CMS together. The project is pre-1.0, so read the note before each upgrade.

Publishing becomes explicit

A save now stages a draft; an explicit Publish writes one commit. The CMS split into composable packages: the local editor is npx @micacms/editor, and @micacms/model became @micacms/core.

Changed

Saving no longer commits; Publish does. A save lands in a draft workspace: the working tree on your own machine, a draft store in the deployed CMS. Edits accumulate where only the editor sees them, and an explicit Publish writes everything pending to the repository as one commit. The repository moves once, when someone decides it should.

The Publish page shows what a pending change does. Each changed field is one row with the stored value beside the staged one, worded by the field type: Yes/No for booleans, option labels for selects, file names for media. You review a comparison, not a diff.

defaultSort now orders the entry list, and its field is checked. The admin lists entries the way the model asks — by a field, or by the position editors arranged by hand. defineSite refuses a sort field the collection does not declare, and names the ones it has. A model already committed with such a value keeps working: the option is dropped and the manual order applies, and the project's next build reports it.

Breaking

The editor split into composable packages. The mode is now which application you run: npx @micacms/editor is the local one — loopback only, and no authentication code at all — and @micacms/self-hosted is the Docker image, behind OpenID Connect. Under both sit the authentication-neutral server, the editing interface as built assets, and a server-only OpenID Connect gate. npx @micacms/cms and MICA_MODE stop working; the two applications replace them.

@micacms/model is renamed to @micacms/core. Update the dependency and the imports in your model module. The module itself is what it was.

Fixed

A saved entry no longer warns about unsaved changes when leaving: the rich text field emits only when its value actually differs from the stored one.

Saving an entry no longer rewrites its media paths. The paths compounded with every save, and the reference stopped resolving after the first one. An entry saved by an earlier version has the wrong path on disk and will not repair itself: git log -p over the content directory shows which, and the fix is to restore the path the entry had before that save.

A cleaner first start

The first start in a new project showed a database line above the startup banner. The banner now comes first.

Fixed

The first start in a new project printed a database line above the startup banner:

info  Applied database migrations count=3 versions=[1,2,3]

Migrations run before Mica has read your content model, and the banner cannot be written until it has. So on a first start, and only then, the log line came first — on the one start where the first line matters most.

Mica now asks for that announcement at debug level when the command runs it. A server log still records it at info level, where it belongs.

One command, and the editor opens

The local command prints one address and opens the editor. There is no sign-in screen on your own machine. Astro 6 or 7 is now required.

Changed

npx @micacms/cms now prints one short banner: the address of the editor, the content directory it reads, and what a save writes. It opens your browser on the editor when you run it from a terminal. Use --no-open to stop that.

There is no sign-in screen on your own machine. Local mode has no identity provider, so there is nothing to ask and no account to create. The editor opens directly.

The command also explains the two things that go wrong first. A port that is already in use names the port and gives you the flag to change it. A missing content directory or content model says what the directory is and which command writes the model.

The getting-started guide is five minutes and leads with the local setup.

Breaking

The default port is 6422, not 4000. Every other development server reaches for 4000, and Astro's own dev server sits on 4321. If your deployment relies on the default port, republish it and update CMS_BASE_URL, the OpenID Connect redirect URI, and any reverse proxy.

Astro 6 or 7 is required. Astro 6 moved content-collection schemas to Zod 4, and Mica gives Astro the schemas it derives from your model. The loader contract did not change, so Astro 6 and 7 behave the same. Stay on version 0.0.4 if your project uses Astro 5. Your content is files either way.

Node 22.12 or newer is required, which is the floor Astro 6 sets.

The first reliable npx release

The Mica command now starts correctly when npm runs it through the node_modules binary link.

Fixed

npx @micacms/cms now starts the server correctly. npm runs a package command through a link in node_modules/.bin. Node resolves the module URL to the real target, so the previous direct-run check did not match and the command ended without output.

This release fixes the command entry point. The local setup in the getting-started guide now works as written.

First public release

The first release includes the model, connectors, Astro integration, editing interface, and self-hosted runtime.

Git-native content

Content is JSON, Markdoc, and media in a Git repository. Each save creates one atomic commit. Per-path revision checks reject stale writes.

One content model

A plain module defines types, runtime validation, editor forms, Astro collections, and the file layout. No code generation keeps these parts in step.

A focused runtime

The first release includes local, GitHub, and GitLab connectors, OpenID Connect authentication for production, a Vue editing interface, and a Hono server with SQLite for accounts and sessions.

Mica is experimental and pre-1.0. A minor version can include a breaking change.

The complete source changelog is in the repository.Read CHANGELOG.md