Roadmap

What ships next

The next release of each product, read from its GitHub milestones every hour. Open ones come first; closed ones sit below, collapsed.

26 open issues across the repositories, read from GitHub every hour

Closed milestones (35)

How to read a big number

A milestone holding a lot of open issues is a bucket, not a plan. Work is filed against the release it is not blocking, so the far milestones collect anything that is real but not next. The nearest milestone for each product is the one being worked.

Due dates are the ones set on the GitHub milestone, not typed here. A milestone past its date shows as Overdue.

Decisions (37)

D1The event-sourced flag belongs to the content type NAMEimplemented

22 Aug 2026

Rules out

storing the flag on the content type document.

Wrong if

content type names stop being the stable identity for content. If types are ever keyed by id with a mutable display name, this moves to that id.

D2An event-sourced type may not hold non-Public fieldsimplemented

22 Aug 2026

Rules out

documenting the erasure limitation and relying on operators to respect it; tombstone-and-rebuild; crypto-shredding.

Wrong if

crypto-shredding gets built. Then the restriction can be lifted for types that use it.

D3Event-sourced types use expected-version concurrencyimplemented

22 Aug 2026

Rules out

matching last-write-wins everywhere for API consistency.

D4The event stream is internal, and nothing may leak it through the APIaccepted

22 Aug 2026

Rules out

returning raw events from the history endpoint, or adding an event-type discriminator to VersionResponse.

D5Events carry when they happenedimplemented

22 Aug 2026

Rules out

deriving the document's timestamps from Marten's IEvent.Timestamp at rebuild time; tolerating the drift.

D6Every write to content goes through one writerimplemented

21 Aug 2026

Rules out

endpoints appending events and storing documents themselves.

D7A rebuild test must not compare against a stored documentimplemented

22 Aug 2026

Rules out

the obvious version of the test.

D8Backfills must make a partial run visibleopen

22 Aug 2026

D9Erasure is a configured mode, and a mode that cannot deliver is refused at startupimplemented

30 Aug 2026

Rules out

picking one mechanism for everyone, and letting an operator change mode freely.

Wrong if

If content turns out to hold personal data in the ordinary case rather than the exceptional one, the default is backwards: CryptoShred should be the default and Delete the opt-out. The signal to watch is what customers actually model in their first content type.

D10An unverified self-registration is not an account, it is a pending rowimplemented

1 Sep 2026

Rules out

The obvious alternative, and the one the issue suggested: keep creating the user and carry an EmailVerified flag, then refuse login (or issue a restricted session) until it is set. That was rejected.

Wrong if

If the address ever stops being the join key, if external sign-in matched on a provider subject id recorded at first link instead, then a flag on User would be enough and the pending row would be ceremony. That is a better design for the external providers anyway (an address can change hands), and if it is ever built, this decision is the one to revisit.

D11Authorisation is enforced in the application; the database enforces tenancy onlyimplemented

2 Sep 2026

Rules out

the database-first backend shape. No PostgREST-style layer that maps HTTP straight onto SQL, no per-end-user Postgres role, no row-level security carrying business rules, and no browser holding a database connection.

Wrong if

If BarakoCMS ever grows a path where an untrusted client talks to Postgres directly (a realtime subscription, a published read replica, an embedded SQL surface for customers) then the database is the only boundary that exists on that path and the answer flips. The signal to watch is a feature request for direct data access that does not go through the API.

D12Scheduled is a real content status, not a condition derived from a dateimplemented

2 Sep 2026

Rules out

Leaving it derived, which is what the admin does today: a draft with a non-null ScheduledPublishAt is shown as scheduled by whoever is looking at it. That keeps the write path and the sweeper untouched and needs no migration, and it was the cheaper answer.

D13The client is a hand-written base plus generated slices, and we do not write the generatorunspecified

18 August 2026

Rules out

Writing the client by hand, which is where this started. It reads well and it drifts, and every module author has to be talked into contributing to it. Also ruled out: generating the whole thing, which produces one ApiClient class with every method on it and none of the ergonomics, and is the reason "generated clients are unpleasant" is a fair objection to the naive version of this.

D14The delivery API is not versioned in the URL; it follows the package versionunspecified

4 September 2026

Rules out

A version segment in the URL (/api/v1/public), a version header, or a version query parameter. FastEndpoints supports all three and the issue named the URL form as the most legible and the easiest to cache, which is true.

Wrong if

A second consumer class with a long upgrade cycle, such as a native app store review queue, that cannot take a breaking change on the notice window and cannot pin the package version it talks to. If that appears, the door is still open: adding a v2 prefix later breaks nothing, while removing one that exists would.

D15The queue owns retry, and an enqueue rides the request's sessionimplemented

4 Sep 2026

D16Document types get expected-version concurrency too, and 4.0 is the only free momentimplemented

5 Sept 2026

Rules out

leaving document types on last-write-wins indefinitely, which is what D3 accepted as an interim state; adding this after the 4.0 tag.

Wrong if

the 3.x upgrade path stops mattering, in which case the flag defaults to true immediately and there is no interim.

D17A money value stays a number; currency and rounding live on the field definitionaccepted

5 Sept 2026

Rules out

storing money as { "amount": 1200, "currency": "PHP" }.

Wrong if

a single field genuinely has to carry its own currency and a sibling field cannot express it. No requirement seen so far needs that.

D18What module authors are promised, and what they are notaccepted

5 Sept 2026

Rules out

inviting outside module authors while the only route to a projection is a hook we have announced we are deleting; changing an extension point without a deprecation window; treating MODULES.md as covering the module contract when it covers only part of it.

Wrong if

modules stop being a supported extension point and become an internal implementation detail, in which case none of this is owed to anybody.

D19Durable execution stays ours, and a workflow definition stays dataaccepted

9 Sept 2026. Superseded in part by D32

Rules out

a first-party Temporal module; a second durable execution engine shipped in core alongside the runner and the queue; wholesale replacement of the runner by a module, as opposed to per-definition routing; a workflow definition that can express iteration or recursion; treating Temporal Cloud as a supported deployment target for anything BaryoDev ships.

Wrong if

workflow definitions stop being documents and become code that developers write, compile and deploy. Then output binding, versioning and determinism replay all become real problems rather than avoided ones, and the calculus inverts completely. Also wrong if a single deployment ever needs concurrent runs at a volume where a Postgres-polling runner cannot keep up, which is a different argument from any made here and should be made with numbers.

D20Where a developer extends, and where they do notaccepted

11 Sept 2026. Superseded in part by D22

Rules out

Brew plugins. Business rules in the renderer. A console screen that only one deployment can use. Modules written for something a workflow already does.

D21It runs wherever containers run, and BaryoVM is one option rather than the pathaccepted

11 Sept 2026

Rules out

Positioning this as a self-hosting product. That is a smaller market and a weaker argument, and it is not even accurate. The position is that you own the software and choose how much of the operating you want to do.

D22A site is configuration; developers extend with plugins; rules go to workflows before modulesaccepted

14 Sept 2026

Rules out

Per-site forks of barakoPress. press.config.ts literals for identity. Site specific code in a client repository. A module for something a workflow can do.

Wrong if

A site that cannot be expressed as blocks and settings without bending the block model out of shape. rckoronadal.org, baryo.dev and barakocms.com are the three tests (#722); if one of them needs site code, the ladder needs another rung, not an exception.

D23BaryoVM is the one deploy engine: VMs first, then Azure and AWS container platformsaccepted

14 Sept 2026

Wrong if

A cloud target whose deploy cannot be driven from its own CLI without BaryoVM holding a long-lived credential. That target stays the cloud pipeline's job.

D24The engines stay MPL-2.0; everything built on them is MITaccepted

14 Sept 2026

Wrong if

A module or client needing an engine file under MIT to be usable at all. MPL-2.0 permits use in closed products, so that should not happen; if it does, it is a reason to revisit D24, not to copy the file.

D25A tenant is a data boundary, not a siteaccepted

15 Sept 2026

Wrong if

A deployment where units share data rather than processes. That is one tenant with permissions, not several tenants.

D26Every setting, secret and operation is either per tenant or per deployment, never neitheraccepted

15 Sept 2026

D27The API owns the site model; barakoPress renders itaccepted

15 Sept 2026

D28A module declares itself once, and is enabled per tenantaccepted

15 Sept 2026

D29The API is the only home of schema, rules and dry runaccepted

15 Sept 2026

D30A content type is a versioned schemaaccepted

15 Sept 2026

D31A principal is an identity plus a membership per tenantaccepted

15 Sept 2026

D32Wolverine runs durable work, behind seams barakoCMS ownsaccepted

15 Sept 2026

Wrong if

The spike in #687 failing on transactional enqueue, conjoined tenancy or migrations. Then the seams stay and the implementation stays ours.

D33Content varies by language per field, not per entryaccepted

15 Sept 2026

D34Frameworks stay behind the contracts others build on, and are used directly inside coreaccepted

15 Sept 2026

D35The package contract is an assembly, not a paragraphaccepted

20 Sept 2026

D36No configured origins outside Development means no cross-origin accessaccepted

20 Sept 2026

D37A workflow keeps an action's outputs by allowlistaccepted

12 Oct 2026