YotoShelf
Development

Contribute

Set up a local development environment and submit your first merge request. YotoShelf is built to welcome AI-assisted contributors.

YotoShelf is open source (MIT) and actively maintained. Contributions are welcome: bug fixes, new features, documentation improvements, and test coverage all count.

Before you start

Read AGENTS.md in the repository root before making any changes. It documents the required workflow, architecture constraints, and the validation checklist every merge request must pass.

The pages under /contribute render sections of the application repository's CONTRIBUTING.md and AGENTS.md, fetched from the repository's main branch when this site is built. Anything those two files do not say, this section does not say either: it links you into the repository instead.

AI-assisted contributors should fetch /llms-full.txt for a complete machine-readable rendition of this documentation.

Sections in this guide

  • How It Works: the AGENTS.md contract summarised, covering stop conditions, blast radius limits, the one-thing-at-a-time rule
  • Architecture: Go + huma + SQLite/sqlc/goose; Astro + Svelte 5 frontend; go-yoto client; design system submodule
  • Dev Loop: clone, mise, just recipes, fixture seeding, E2E
  • CI: the pipeline the app repo defines, and the gates just check runs locally
  • Conventions: file-size limits, structural conformity, i18n, error handling

Quick start

git clone --recurse-submodules https://gitlab.com/yotoshelf/yotoshelf.git
cd yotoshelf
mise install    # installs exact Go, Node, sqlc, golangci-lint versions
just dev        # starts backend + frontend, creates admin user

Note: --recurse-submodules is required — the frontend consumes frontend/design as a git submodule. If you already cloned without it, run git submodule update --init.

Login at http://localhost:4300 with admin@localhost / admin.

Warning: The default credentials above are dev-only and are seeded automatically by just dev. Never use them in production — use create-admin with a strong password instead.

After every change

After every change, run:

just check

This runs every local-runnable CI gate (lint + tests + build + govulncheck + npm audit + i18n). If it passes locally, it passes in CI.