Unified monorepo for All Things Linux: marketing site, portal (identity stack), chat infrastructure (IRC / XMPP / bridge), network services, and observability stack.
apps/
├── web @atl/web — marketing site (Next.js 16, OpenNext / Cloudflare)
├── portal @atl/portal — identity & admin portal (Next.js 16, PostgreSQL)
├── chat-web @atl/chat-web — atl.chat landing page (Next.js 16)
├── docs @atl/docs — product documentation (Mintlify)
└── bridge Discord↔IRC↔XMPP bridge (Python / uv — NOT in pnpm workspace)
packages/
└── ui @atl/ui — shared design system (shadcn/ui + @base-ui/react)
services/
├── chat/ IRC (UnrealIRCd + Atheme), XMPP (Prosody), web clients
├── network/ DNS (Blocky), TURN (coturn), uptime (Gatus), SFTP
└── observability/ Grafana, Loki, Mimir, Alloy, Alloy Agent, Blackbox
infra/
├── compose/ Docker Compose fragments (chat-*.yaml, network, observability, cert-manager, networks)
└── nginx/ Nginx reverse proxy config (Prosody HTTPS)
scripts/ Shell scripts (init.sh — data dirs + dev certs)
apps/ = software we build and own (polyglot: Next.js + Python).
services/ = external software we extend, configure, and operate.
packages/ = shared JS/TS libraries.
Package names: @atl/* for org-level apps and shared libraries. @portal/* for portal-internal packages under apps/portal/packages/*.
| Tool | Version | Notes |
|---|---|---|
| Node.js | >=24 |
Pinned in .nvmrc and mise.toml |
| pnpm | >=10 |
Managed via Corepack (packageManager field) |
| uv | latest | Python package manager for apps/bridge |
| Docker + Compose | — | Required for services/* |
| just | latest | Task runner (cargo install just or OS pkg) |
git clone https://github.com/allthingslinux/monorepo.git
cd monorepo
just setup # pnpm install + uv sync + init.sh + env filesjust setup copies .env.example → .env and .env.dev.example → .env.dev if they don't already exist. Edit them before starting services.
Run just to see all available recipes grouped by domain.
| Command | Purpose |
|---|---|
just setup |
Full bootstrap (JS + Python + env + certs) |
just dev |
Start all JS apps via Turborepo |
just build |
Production build (Turbo graph) |
just check |
Lint + format check (Ultracite) |
just fix |
Lint + format fix (Ultracite) |
just typecheck |
TypeScript validation across all packages |
just test |
Run all tests via Turborepo |
just clean |
Remove build artifacts |
| Command | Purpose |
|---|---|
just portal-dev |
Portal dev server |
just portal-db-up |
Start PostgreSQL (Docker) |
just portal-db-push |
Push schema to dev DB |
just portal-db-studio |
Open Drizzle Studio |
just web-dev |
Marketing site dev server |
just chat-web-dev |
atl.chat dev server |
just docs-dev |
Mintlify docs preview |
| Command | Purpose |
|---|---|
just chat-dev |
Start all chat services (dev profile) |
just chat-down |
Stop chat services |
just chat-logs |
Tail logs (optionally filter by name) |
just chat-status |
Show running containers |
just chat-build |
Build all service images |
| Command | Purpose |
|---|---|
just bridge-check |
Ruff lint + format check |
just bridge-fix |
Ruff lint fix + format |
just bridge-typecheck |
basedpyright type check |
just bridge-test |
pytest suite |
Three env file layers at the repo root:
| File | Purpose |
|---|---|
.env |
Shared secrets and base config |
.env.dev |
Dev-only overrides (ports, debug flags) |
.env.prod |
Production overrides |
Docker Compose always requires --env-file .env --env-file .env.dev (or .env.prod). The just recipes handle this automatically.
Portal has its own .env at apps/portal/.env — see apps/portal/README.md for details.
| Concern | Location |
|---|---|
| Git | Root .gitignore |
| Commits | commitlint.config.cjs + .husky/commit-msg |
| Lint / format | .oxlintrc.json + .oxfmtrc.jsonc (Ultracite: Oxlint + Oxfmt) |
| Pre-commit | Husky + lint-staged (see below) |
| Turborepo | Root turbo.json; app overrides in apps/*/turbo.json |
| Dependency versions | pnpm-workspace.yaml catalog: section |
| CI | .github/workflows/ + .github/actions/setup-node-pnpm/ |
| Renovate | .github/renovate.json5 |
| Docker | infra/compose/*.yaml included by root compose.yaml |
| Glob | Tools |
|---|---|
*.{ts,tsx,js,jsx} |
Oxlint + Oxfmt |
*.py |
Ruff check --fix + format |
*.sh |
ShellCheck + shfmt |
Workflows in .github/workflows/:
portal-ci.yml— lint, type-check, build, test, knip, releaseportal-deploy.yml— Docker build + SSH deploy (staging / production)portal-rollback.yml— manual rollback via workflow_dispatchportal-migrate.yml— manual database migrationportal-maintenance.yml— TODO-to-issue conversionweb-deploy.yml— OpenNext deploy to Cloudflare Workers (PR previews + prod)chat-ci.yml— bridge lint / test / coverage, Docker builds for IRC / XMPP / bridgedocs-ci.yml— Mintlify validate + broken link checkcodeql.yml— CodeQL SAST (JS/TS, Python, Actions)dependency-review.yml— PR dependency vulnerability checkdependency-submission.yml— bridgeuv.lock→ GitHub dependency graphlint-infra.yml— actionlint, hadolint, shellcheck, shfmtpr-title.yml— conventional commit PR title validationpr-label.yml— auto-label PRs by changed paths
Reusable workflows: reusable-py-check.yml, reusable-docker-build.yml