{"id":47699977,"url":"https://github.com/allthingslinux/monorepo","last_synced_at":"2026-04-02T17:04:54.087Z","repository":{"id":346475495,"uuid":"1190119734","full_name":"allthingslinux/monorepo","owner":"allthingslinux","description":"All Things Linux","archived":false,"fork":false,"pushed_at":"2026-03-25T00:58:22.000Z","size":14069,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-03-25T02:30:07.525Z","etag":null,"topics":["501c3","alchemy","cloudflare","foss","linux","mintlify","monorepo","nextjs","open-source","oxfmt","oxlint","pnpm","shadcn-ui","tailwindcss-v4","turborepo","typescript"],"latest_commit_sha":null,"homepage":"https://allthingslinux.org","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/allthingslinux.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":"AGENTS.md","dco":null,"cla":null},"funding":{"github":"allthingslinux","open_collective":"allthingslinux"}},"created_at":"2026-03-24T01:36:43.000Z","updated_at":"2026-03-25T00:58:26.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/allthingslinux/monorepo","commit_stats":null,"previous_names":["allthingslinux/monorepo"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/allthingslinux/monorepo","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/allthingslinux%2Fmonorepo","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/allthingslinux%2Fmonorepo/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/allthingslinux%2Fmonorepo/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/allthingslinux%2Fmonorepo/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/allthingslinux","download_url":"https://codeload.github.com/allthingslinux/monorepo/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/allthingslinux%2Fmonorepo/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31311070,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-02T12:59:32.332Z","status":"ssl_error","status_checked_at":"2026-04-02T12:54:48.875Z","response_time":89,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["501c3","alchemy","cloudflare","foss","linux","mintlify","monorepo","nextjs","open-source","oxfmt","oxlint","pnpm","shadcn-ui","tailwindcss-v4","turborepo","typescript"],"created_at":"2026-04-02T17:04:51.968Z","updated_at":"2026-04-02T17:04:54.074Z","avatar_url":"https://github.com/allthingslinux.png","language":"TypeScript","readme":"# allthingslinux monorepo\n\nUnified monorepo for [All Things Linux](https://allthingslinux.org): marketing site, portal (identity stack), chat infrastructure (IRC / XMPP / bridge), self-hosted tools ([atl.tools](https://atl.tools)), network services, and observability stack.\n\n## Layout\n\n```\napps/\n├── web            @atl/web — marketing site (Next.js 16, OpenNext / Cloudflare)\n├── portal         @atl/portal — identity \u0026 admin portal (Next.js 16, PostgreSQL)\n├── chat-web       @atl/chat-web — atl.chat landing page (Next.js 16)\n├── docs           @atl/docs — product documentation (Mintlify)\n├── tools-web      @atl/tools-web — atl.tools directory (Next.js 16, OpenNext / Cloudflare)\n└── bridge         Discord↔IRC↔XMPP bridge (Python / uv — NOT in pnpm workspace)\n\npackages/\n├── ui             @atl/ui — shared design system (shadcn/ui + @base-ui/react)\n└── tools-manifest @atl/tools-manifest — tool definitions consumed by apps/tools-web\n\nservices/\n├── chat/          IRC (UnrealIRCd + Atheme), XMPP (Prosody), web clients\n├── network/       DNS (Blocky), TURN (coturn), uptime (Gatus), SFTP\n├── tools/         Self-hosted tools (PrivateBin, SearXNG, Stirling-PDF, …)\n└── observability/ Grafana, Loki, Mimir, Alloy, Alloy Agent, Blackbox\n\ninfra/\n├── chat/          Docker Compose fragments (chat-*.yaml)\n├── network/       Docker Compose fragments (network.yaml)\n├── observability/ Docker Compose fragments (observability.yaml)\n├── tools/         Docker Compose fragments (tools-*.yaml)\n├── nginx/         Nginx reverse proxy config (Prosody HTTPS)\n├── sh/            atl.sh pubnix provisioning (Ansible, Terraform, skel, Vagrant)\n├── cert-manager.yaml  TLS certificate management (included by root compose.yaml)\n└── networks.yaml      Shared Docker network definitions (included by root compose.yaml)\n\nscripts/           Shell scripts (init.sh — data dirs + dev certs)\n\ntests/\n├── unit/          Bridge unit tests\n├── integration/   Bridge integration tests\n├── e2e/           End-to-end tests\n├── protocol/      Protocol-level tests\n└── ...            fixtures/, controllers/, irc_utils/, utils/, legacy/\n```\n\n`apps/` = software we build and own (polyglot: Next.js + Python).\n`services/` = external software we extend, configure, and operate.\n`packages/` = shared JS/TS libraries.\n\nPackage names: `@atl/*` for org-level apps and shared libraries. `@portal/*` for portal-internal packages under `apps/portal/packages/*`.\n\n## Requirements\n\n| Tool                                        | Version | Notes                                         |\n| ------------------------------------------- | ------- | --------------------------------------------- |\n| [Node.js](https://nodejs.org)               | `\u003e=24`  | Pinned in `.nvmrc` and `mise.toml`            |\n| [pnpm](https://pnpm.io)                     | `\u003e=10`  | Managed via Corepack (`packageManager` field) |\n| [uv](https://docs.astral.sh/uv/)            | latest  | Python package manager for `apps/bridge`      |\n| [Docker](https://www.docker.com/) + Compose | —       | Required for `services/*`                     |\n| [just](https://just.systems)                | latest  | Task runner (`cargo install just` or OS pkg)  |\n\n## Getting started\n\n```bash\ngit clone https://github.com/allthingslinux/monorepo.git\ncd monorepo\njust setup        # pnpm install + uv sync + init.sh + env files\n```\n\n`just setup` copies `.env.example` → `.env` and `.env.dev.example` → `.env.dev` if they don't already exist. Edit them before starting services.\n\n## Commands\n\nRun `just` to see all available recipes grouped by domain.\n\n### Workspace\n\n| Command                  | Purpose                                    |\n| ------------------------ | ------------------------------------------ |\n| `just setup`             | Full bootstrap (JS + Python + env + certs) |\n| `just install`           | `pnpm install`                             |\n| `just install-frozen`    | `pnpm install --frozen-lockfile`           |\n| `just dev`               | Start all JS apps via Turborepo            |\n| `just build`             | Production build (Turbo graph)             |\n| `just check`             | Lint + format check (Ultracite)            |\n| `just fix`               | Lint + format fix (Ultracite)              |\n| `just typecheck`         | TypeScript validation across all packages  |\n| `just test`              | Run all tests via Turborepo                |\n| `just test-coverage`     | Run tests with coverage                    |\n| `just clean`             | Remove build artifacts                     |\n| `just renovate-validate` | Validate Renovate config                   |\n| `just docker-clean`      | Prune unused Docker images and volumes     |\n\n### Apps\n\n| Command                   | Purpose                          |\n| ------------------------- | -------------------------------- |\n| `just web-dev`            | Marketing site dev server        |\n| `just web-build`          | Build marketing site             |\n| `just web-deploy`         | Deploy to Cloudflare Workers     |\n| `just chat-web-dev`       | atl.chat dev server              |\n| `just chat-web-build`     | Build atl.chat site              |\n| `just portal-dev`         | Portal dev server                |\n| `just portal-build`       | Build portal                     |\n| `just portal-start`       | Start portal (production mode)   |\n| `just portal-db-up`       | Start PostgreSQL (Docker)        |\n| `just portal-db-down`     | Stop PostgreSQL                  |\n| `just portal-db-generate` | Generate Drizzle migration files |\n| `just portal-db-migrate`  | Run pending migrations           |\n| `just portal-db-push`     | Push schema to dev DB            |\n| `just portal-db-seed`     | Seed the database                |\n| `just portal-db-studio`   | Open Drizzle Studio              |\n| `just docs-dev`           | Mintlify docs preview            |\n| `just docs-build`         | Build docs                       |\n| `just docs-check-links`   | Check for broken links           |\n\n### Tools (atl.tools)\n\n| Command                 | Purpose                                |\n| ----------------------- | -------------------------------------- |\n| `just tools-dev`        | Start all tools Docker services (dev)  |\n| `just tools-up`         | Start all tools Docker services (prod) |\n| `just tools-down`       | Stop all tools Docker services         |\n| `just tools-logs`       | Tail tools container logs              |\n| `just tools-status`     | Show running tools containers          |\n| `just tools-build`      | Build custom service images            |\n| `just tools-web-dev`    | atl.tools Next.js dev server           |\n| `just tools-web-build`  | Build atl.tools site                   |\n| `just tools-web-deploy` | Deploy atl.tools to Cloudflare Workers |\n\n### Chat services (Docker)\n\n| Command               | Purpose                                      |\n| --------------------- | -------------------------------------------- |\n| `just chat-init`      | Initialize chat data directories and config  |\n| `just chat-dev`       | Start all chat services (dev profile)        |\n| `just chat-prod`      | Start all chat services (production profile) |\n| `just chat-down`      | Stop chat services (dev)                     |\n| `just chat-down-prod` | Stop chat services (production)              |\n| `just chat-logs`      | Tail logs (optionally filter by name)        |\n| `just chat-status`    | Show running containers                      |\n| `just chat-build`     | Build all service images                     |\n| `just prosody-token`  | Generate a Prosody API token                 |\n| `just gencloak`       | Generate IRC cloaking key                    |\n\n### Bridge (Python)\n\n| Command                 | Purpose                    |\n| ----------------------- | -------------------------- |\n| `just bridge-install`   | `uv sync --all-extras`     |\n| `just bridge-check`     | Ruff lint + format check   |\n| `just bridge-fix`       | Ruff lint fix + format     |\n| `just bridge-typecheck` | basedpyright type check    |\n| `just bridge-test`      | pytest suite               |\n| `just bridge-logs`      | Tail bridge container logs |\n\n### Pubnix (atl.sh)\n\n| Command                                 | Purpose                             |\n| --------------------------------------- | ----------------------------------- |\n| `just pubnix-setup`                     | Install Ansible deps + galaxy roles |\n| `just pubnix-deploy \u003ctarget\u003e`           | Ansible deploy (dev/staging/prod)   |\n| `just pubnix-deploy-tag \u003ctarget\u003e \u003ctag\u003e` | Deploy specific roles by tag        |\n| `just pubnix-deploy-check \u003ctarget\u003e`     | Dry run (check mode)                |\n| `just pubnix-molecule-test \u003crole\u003e`      | Molecule test for an Ansible role   |\n| `just pubnix-smoke-test \u003ctarget\u003e`       | End-to-end smoke test               |\n| `just pubnix-tf-plan`                   | Terraform plan                      |\n| `just pubnix-dev-up`                    | Start Vagrant dev VM                |\n| `just pubnix-lint`                      | ansible-lint + pre-commit           |\n\n## Environment variables\n\nThree env file layers at the repo root:\n\n| File        | Purpose                                 |\n| ----------- | --------------------------------------- |\n| `.env`      | Shared secrets and base config          |\n| `.env.dev`  | Dev-only overrides (ports, debug flags) |\n| `.env.prod` | Production overrides                    |\n\nDocker Compose always requires `--env-file .env --env-file .env.dev` (or `.env.prod`). The `just` recipes handle this automatically.\n\nTwo Compose override files handle environment-specific service config:\n\n| File                         | Purpose                                        |\n| ---------------------------- | ---------------------------------------------- |\n| `compose.dev-override.yaml`  | Dev overrides (bind mounts, debug ports, etc.) |\n| `compose.prod-override.yaml` | Production overrides (restart policies, etc.)  |\n\n`just chat-dev` uses `compose.yaml` + `compose.dev-override.yaml`. `just chat-prod` uses `compose.yaml` + `compose.prod-override.yaml`.\n\nPortal has its own `.env` at `apps/portal/.env` — see `apps/portal/README.md` for details.\n\n## Shared config\n\n| Concern             | Location                                                                          |\n| ------------------- | --------------------------------------------------------------------------------- |\n| Git                 | Root `.gitignore`                                                                 |\n| Commits             | `commitlint.config.cjs` + `.husky/commit-msg`                                     |\n| Lint / format       | `.oxlintrc.json` + `.oxfmtrc.jsonc` (Ultracite: Oxlint + Oxfmt)                   |\n| Pre-commit          | Husky + lint-staged (see below)                                                   |\n| Turborepo           | Root `turbo.json`; app overrides in `apps/*/turbo.json`                           |\n| Dependency versions | `pnpm-workspace.yaml` `catalog:` section                                          |\n| CI                  | `.github/workflows/` + `.github/actions/setup-node-pnpm/`                         |\n| Renovate            | `.github/renovate.json5`                                                          |\n| Docker              | `infra/{chat,network,observability,tools}/*.yaml` included by root `compose.yaml` |\n\n### Pre-commit hooks (Husky + lint-staged)\n\n| Glob                | Tools                     |\n| ------------------- | ------------------------- |\n| `*.{ts,tsx,js,jsx}` | Oxlint + Oxfmt            |\n| `*.py`              | Ruff check --fix + format |\n| `*.sh`              | ShellCheck + shfmt        |\n\n## CI / GitHub Actions\n\nWorkflows in `.github/workflows/`:\n\n- `portal-ci.yml` — lint, type-check, build, test, knip, release for @atl/portal\n- `portal-deploy.yml` — Docker build + SSH deploy (staging / production)\n- `portal-rollback.yml` — manual rollback via workflow_dispatch\n- `portal-migrate.yml` — manual database migration\n- `portal-maintenance.yml` — TODO-to-issue conversion on push to main\n- `web-deploy.yml` — Alchemy / OpenNext deploy to Cloudflare Workers (PR previews + prod)\n- `chat-ci.yml` — bridge lint / test / coverage, Docker builds for IRC / XMPP / bridge\n- `chat-web-ci.yml` — lint, typecheck, turbo build for @atl/chat-web\n- `chat-web-deploy.yml` — Alchemy / OpenNext deploy for atl.chat (prod)\n- `tools-ci.yml` / `tools-deploy.yml` — @atl/tools-web + tools-manifest checks and deploy\n- `pubnix-ci.yml` — Ansible lint, Terraform validate, ShellCheck for `infra/sh` (Molecule is local: `just pubnix-molecule-test`)\n- `docs-ci.yml` — Mintlify validate + broken link check\n- `codeql.yml` — CodeQL SAST (JS/TS, Python, Actions)\n- `dependency-review.yml` — PR dependency vulnerability check\n- `dependency-submission.yml` — bridge `uv.lock` → GitHub dependency graph\n- `lint-infra.yml` — actionlint, hadolint, shellcheck, shfmt\n- `pr-title.yml` — conventional commit PR title validation\n- `pr-label.yml` — auto-label PRs by changed paths\n\nReusable workflows: `reusable-py-check.yml`, `reusable-docker-build.yml`\n\nComposite: `.github/actions/setup-node-pnpm/` (Node + pnpm + frozen install).\n\n**Maintainers:** required checks and merge queue — [.github/REQUIRED_CHECKS.md](.github/REQUIRED_CHECKS.md); workflow metrics — [.github/docs/CI_METRICS.md](.github/docs/CI_METRICS.md); `harden-runner` policy — [.github/HARDEN_RUNNER.md](.github/HARDEN_RUNNER.md).\n\n## License\n\n[GPL-3.0](LICENSE)\n\n## Stats\n\n![Metrics](https://repobeats.axiom.co/api/embed/024cbbc4dc82cdc3fa9e0d304ff5a45607f2b656.svg)\n\n## Contributors\n\n![Contributors](https://contrib.rocks/image?repo=allthingslinux/monorepo)\n","funding_links":["https://github.com/sponsors/allthingslinux","https://opencollective.com/allthingslinux"],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fallthingslinux%2Fmonorepo","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fallthingslinux%2Fmonorepo","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fallthingslinux%2Fmonorepo/lists"}