The PSA Systems SaaS platform - signup, subscription billing, platform admin, and an OpenID Connect provider for the Mokosh PSA product.
Surfaces what matters.
Live staging: https://a8n.systems. Sign up with a throwaway email and click through the product.
Staging shows features in development, not a polished demo. State is wiped on every deploy - accounts, organizations, and data are throwaway. Do not reuse a real password.
Two Rust services in one Cargo workspace:
- bunyip-web (port 4400) - the browser-facing front-end. Axum server-rendered HTML (Maud + htmx), no SPA. It is a BFF: it talks to bunyip-api over
/v1and renders the pages. - bunyip-api (port 4401) - the backend and the OIDC / OAuth 2.1 issuer (
/.well-known/*,/oauth2/*). Real PostgreSQL persistence, at-rest encryption, Stripe billing, email.
Domain code lives in crates/bunyip-{domain,oci,oidc}, with the branding-free SSR building blocks in crates/web-kit; the generic, domain-free kernel is the dunite-core git dependency. Dependency direction is strictly downward: bunyip-api -> bunyip-oci/oidc -> bunyip-domain -> dunite-core.
Requires Docker or Podman with Compose.
just devThen:
- Front-end: http://localhost:4400
- API health: http://localhost:4401/health
- OIDC discovery: http://localhost:4401/.well-known/openid-configuration
Full dev setup, including SSO against Mokosh, is in docs/getting-started.md.
compose.yml is the reference deployment: the published bunyip-api and bunyip-web images plus PostgreSQL, behind a Traefik edge that terminates TLS. The two images are released as a matched pair and pinned together (BUNYIP_API_IMAGE / BUNYIP_WEB_IMAGE); startup secrets are files provided through the {NAME}_FILE convention, never plain environment variables.
The full self-host guide - topology, deploy, update checking, and applying updates - is in docs/self-hosting.md.
- Every configuration variable and where its value comes from: docs/configuration.md
- Secrets, the two-tier model, and Infisical: docs/secrets-infisical.md
Operator and developer docs live in docs/:
- getting-started.md - local dev stack and sign-in
- configuration.md - the full environment-variable and in-app-settings reference
- self-hosting.md - deploy, update, and run the released images
- secrets-infisical.md - secret sourcing and rotation
Contributor-facing conventions for AI agents working in this repository are in CLAUDE.md.
- Work happens in
feat//fix//chore/<short-descriptive-name>branches offmain; the merge target ismainvia PR. - Clone with
git clone --recurse-submodules, or rungit submodule update --initin an existing clone: the rootjustfileimports the shared recipes from thecommonsubmodule (psa-systems/common), and without it everyjustcommand is a parse error. just checkruns fmt + clippy + build + the docker builder stage; dev boxes without a local Rust toolchain usejust check-container.just install-hookswrites the git pre-commit hook; the hook andjust pre-commitcome fromcommonand run the same fmt + clippy + build + test sequence CI does, inside thecompose.dev.ymlapiservice.- Dev container names follow
dev-bunyip-<service>-${USER}on networkdev-bunyip-private-${USER}; the production stack (compose.yml) drops thedev-prefix. - Releases:
just create-release <major|minor|hotfix>bumps the workspace version and opens a release PR; merging it tagsvX.Y.Zand publishes the images. Both halves come fromcommon- the recipe fromcommon/common.just, and.forgejo/workflows/create-release.ymlas a caller stub for the reusable workflow that tags and writes the release notes. The recipe'sCargo.locksync runs host-sidecargo, so cut releases from a box with a Rust toolchain. - CI reads a fixed set of repository-level Forgejo Actions secrets and variables; the authoritative list is in
e2e/README.md, and values are never recorded in the repo.
The development home for this repository is https://dev.a8n.run/psa-systems/bunyip. The GitHub and Codeberg copies are read-only mirrors that exist for visibility only: issues and pull requests are disabled there, and no community support runs on the mirrors. File issues and open pull requests on Forgejo.
Please do not report a suspected vulnerability through the public issue tracker, on Forgejo or on either mirror: filing it there publishes it. Contact a maintainer privately instead. A published disclosure address and a SECURITY.md are being set up and this section will link to them.
MIT. See LICENSE.
Bunyip is built by PSA Systems, and the Bunyip artwork is original to the project.
Built on Rust, Actix Web, Maud, Tailwind CSS and PostgreSQL, and deployed behind Traefik. Secrets are sourced through Infisical.