Skip to content
Alvo is pre-v0.1: the image runs from its edge tag, and no NuGet package or release is published yet.Pre-v0.1: no release yet.Roadmap and status

Roadmap and status

See where Alvo is before v0.1, what may still change before the release and what you can rely on, what v0.1 means, and what is planned after it.

Alvo is pre-v0.1. Everything this site documents runs today and is tested on every change. The standalone image is published from main as ghcr.io/burgyn/alvo:edge, with no release tag yet; no NuGet package is published, so an embedded host references the projects from a clone. This page says what that means for you. The live plan is docs/PLAN.md on GitHub; where the two disagree, it wins.

The plan moves in phases, each a GitHub milestone, one at a time:

PhaseWhat it delivered or deliversStatus
Skeletonsomething to build ondone
Quality before codeevery test and review gate, set up on empty projectsdone
Schema foundationthe descriptor’s JSON Schema, and one entity model with room for a second, dynamic driverdone
Vertical slicedescriptor to tables to a generated REST API, with validationdone
Demo from the startrunnable examples and the end-to-end suites that drive themdone
Admin modethe dashboard, the rule and hook editors, the schema assistantin progress
v0.1the documentation you are reading, the logo, and the releasenext
Further componentsthe rest of the backend-as-a-service surface, by value, including dynamic entitiesplanned

The release phase also carries the debt on what already ships: known defects, gaps between engines, and the health of the test gates. A release does not go out with a known hole.

  • The parts of the descriptor format that are warned or refused. A block this build parses and does not run, such as automation, functions or dynamicEntities, will start doing what it declares when its feature lands; a refused key stops being refused. The list is Capabilities in this build. Today’s honoured behaviour is not what this item is about.
  • The Management API’s routes and bodies. It has no OpenAPI document of its own yet; its reference here is generated from the running route table. Expect it to be described, and possibly reshaped, before it is frozen.
  • The base URI of the problem types. A refusal’s type is https://alvo.dev/errors/<slug>, and that address does not resolve today. The base may move; the slug after it does not (Problem types explains the mapping).
  • The schema’s URL. A descriptor’s $schema and the schema’s own $id, https://alvo.dev/schema/v1/project.json, do not resolve either. This site serves a copy at https://alvo.burgyn.online/schema/v1/project.json; the canonical address may still change.
  • The environment-variable names of the container, which become a breaking change once a release tag of the image is published (#233).
  • The descriptor format version, apiVersion: alvo.dev/v1. The schema’s own rule: within v1 the format only grows; a breaking change becomes alvo.dev/v2.
  • The problem-type slugs, the fifteen in Problem types. They are the contract a client branches on, and detail is not.

The Data API’s URL grammar follows PostgREST on purpose, and its known deviations are documented (Data API conventions), but no source declares it frozen before v0.1.

v0.1 is the first release: publishing the MMLib.Alvo.* packages on NuGet and a versioned tag of the standalone image, with this documentation. Until then, Quick start runs the image’s edge tag, built from main, and Embed in ASP.NET Core references the projects or a local package feed. Install commands for the published packages appear only in tabs marked available from v0.1.

Open defects the documentation pages point to.

IssueWhat happens
#103An entity added through the Management API or the dashboard gets no Data API route until the host restarts.
#340The standalone host exits with code 139 on an invalid descriptor, instead of the clean refusal and exit code 78.
#343A dry run of a destructive change is refused like a real apply.
#344Small inconsistencies: an unverified author on Management API revisions, different statuses for writes to derived fields.
#345A before-hook may mutate a rollup or computed field, which the apply should refuse.
#350Filter negation is spelled not.field=op.value, not PostgREST’s field=not.op.value.
#351A write to a child row recomputes the parent’s rollups without advancing the parent’s ETag, so an If-Match or If-None-Match taken before it still matches.
#354A request that races a runtime apply can be judged by the old policy and read with the new schema, so a field the apply just made hidden can be returned once.
#355A write that reaches a database NOT NULL constraint the API did not check first answers 500 instead of a structured refusal.

After v0.1, components are added one at a time, ordered by value, each with its contract tests first. The plan names these candidates; none has a date:

  • Automation: rules that react to events, with signed webhook deliveries and redelivery.
  • Custom functions: scripts and a runtime to execute them, beyond the C# functions an embedded host registers today.
  • Full authentication: sign-in providers beyond local passwords, and issuing and revoking API keys (#36).
  • Teams and permissions on top of roles, and richer caller context in rules.
  • Realtime change notifications and file storage.
  • Dynamic entities: record types your own users define at runtime, in one shared store.
  • An audit log of data changes, beside today’s history of configuration changes.

Not every candidate becomes its own package: the core stays one package unless a feature brings a heavy dependency, is a real swap point, or ships differently.