Watch
1
0
Fork
You've already forked store
0
The primary repo for the project with the site backend and frontend, as well as the utility programs to scan, build, and ingest extensions.
  • Go 80.2%
  • Astro 11.9%
  • Shell 4.9%
  • Just 1.2%
  • TypeScript 1%
  • Other 0.8%
Repository files (latest commit first)
Filename Latest commit message Latest commit date
cat-dev-null e1b2f00d2c
All checks were successful
Deploy / test (push) Successful in 35s
Deploy / build-backend (push) Successful in 1m29s
Deploy / build-web (push) Successful in 1m25s
Deploy / deploy-backend (push) Successful in 37s
Deploy / deploy-web (push) Successful in 12s
Removed em dash from site title
Simply too wide
2026年06月03日 16:54:37 -06:00
.forgejo/workflows Fix CI build? 2026年06月02日 17:53:11 -06:00
.zed Fixed formatting and auto-formatting of files 2026年05月31日 15:15:35 -06:00
cmd Added signing CRX files 2026年06月03日 16:46:37 -06:00
deploy Added signing CRX files 2026年06月03日 16:46:37 -06:00
docs Build (unsigned) XPI and CRX instead of just ZIP 2026年06月02日 12:49:58 -06:00
examples Moved extension.schema.json to registry repo 2026年06月02日 18:55:14 -06:00
internal Added signing CRX files 2026年06月03日 16:46:37 -06:00
migrations Step 2 2026年05月29日 12:07:50 -06:00
scripts Injects update_url into an extension's manifes.json while building 2026年06月02日 19:26:50 -06:00
web Removed em dash from site title 2026年06月03日 16:54:37 -06:00
.editorconfig Step 1 2026年05月28日 23:50:02 -06:00
.env.example Added signing CRX files 2026年06月03日 16:46:37 -06:00
.gitignore Step 1 2026年05月28日 23:50:02 -06:00
CONTRIBUTING.md Some more edits to PRIVACY.md, TERMS.md, and CONTRIBUTING.md 2026年05月31日 22:22:48 -06:00
CONTRIBUTORS.md Added CONTRIBUTORS.md 2026年05月31日 22:48:06 -06:00
go.mod Fix CI build? 2026年06月02日 17:53:11 -06:00
go.sum Steps 9 and 10 2026年05月30日 17:39:08 -06:00
justfile Justfile recipe for convenience 2026年05月31日 19:37:31 -06:00
LICENSE Step 1 2026年05月28日 23:50:02 -06:00
PRIVACY.md Some more edits to PRIVACY.md, TERMS.md, and CONTRIBUTING.md 2026年05月31日 22:22:48 -06:00
README.md Renamed the org from fossextensions to foss-extensions 2026年05月31日 14:42:59 -06:00
SECURITY.md Steps 9 and 10 2026年05月30日 17:39:08 -06:00
TERMS.md Some more edits to PRIVACY.md, TERMS.md, and CONTRIBUTING.md 2026年05月31日 22:22:48 -06:00
VERSION Added version - set to 0.1.0 2026年05月31日 16:03:58 -06:00

FOSS Extensions Store

License: AGPL-3.0 Language: Go Status: MVP

📄 Pitch (NLnet) · 🗺️ Roadmap · 🔒 Threat model · 🏗️ Architecture · 📸 Screenshots

An open-source browser extension store — think F-Droid for Chrome extensions. Developers register their existing Git repo; we clone, scan, and build every tagged release from source, then publish the artifact alongside a transparent scan report. No central gatekeeping, no opaque review.

Status: MVP complete. just demo produces a working end-to-end stack. Not yet ready for production end-users — see roadmap.

Why

  • Transparency. Every extension ships with a full scan report: declared permissions, dependency audit, static-analysis findings — all publicly visible.
  • Reproducibility. Artifacts are built deterministically from a specific Git commit. The SHA-256 is independently verifiable.
  • No vendor gatekeeping. Licensed AGPL-3.0. The store cannot be quietly captured, monetised, or shut down by a single vendor.

Run the demo

Requires Docker or Podman with compose support, plus git.

just demo
# → http://localhost:4321

Initialises two demo extensions, starts Postgres + API + frontend, runs the ingestion pipeline, and prints the URL. First run: ~3–5 minutes (image builds). Subsequent runs: ~30 seconds.

just demo-down # stop and remove the database
rm -rf var/ # full reset (also removes demo repos)
just demo # re-run from scratch

See deploy/README.md for the full compose service breakdown.

Build

Requires Go 1.23+ and just.

just build # compile all five binaries into ./bin/
just test # run test suite
just vet # go vet
just fmt # gofmt

Architecture

Five Go binaries + an Astro frontend, all communicating through PostgreSQL and a shared artifact filesystem. Extension metadata lives in a separate registry repo — the backend tracks it continuously via git fetch, not a submodule.

See docs/ARCHITECTURE.md for the full design, including the two-tier runtime model (worker vs. API) and the data flow diagram.

Configuration

Variable Default Description
FES_DATABASE_URL Postgres DSN, e.g. postgres://user:pass@localhost/fes?sslmode=disable
FES_REGISTRY_URL Git URL of the registry repo (cloned/fetched on each poll cycle)
FES_REGISTRY_PATH Raw directory path to the registry; no git ops (for local dev/tests)
FES_REGISTRY_CACHE ./var/registry Local clone destination when using FES_REGISTRY_URL
FES_ARTIFACTS_ROOT ./var/artifacts Where built extension artifacts are stored
FES_ALLOWED_ORIGINS http://localhost:4321 Comma-separated CORS origins for POST /api/reports
FES_LOG_FORMAT text Set to json for structured JSON logs
FES_PUBLIC_API_BASE http://localhost:8080 API base URL baked into the Astro build

See .env.example for the values used by the Docker Compose demo. See internal/api/README.md for the full API endpoint reference.

Adding an extension to the store

Extensions are submitted to the separate registry repository by opening a PR that adds one YAML file. See CONTRIBUTING.md for the full workflow and consent requirements.

Documentation

Doc Purpose
docs/PITCH.md One-page grant application summary (NLnet format)
docs/THREAT_MODEL.md Adversary analysis and honest scanner limitations
docs/ROADMAP.md Phase 1 (done), Phase 2 (post-grant), Phase 3+
docs/ARCHITECTURE.md System design, data flow, component descriptions
docs/HOSTING.md Single-VPS to multi-tier scaling guide
docs/SCREENSHOTS/ Screenshots from the live demo

Contributing

See CONTRIBUTING.md for how to add an extension, build locally, and submit code PRs. See SECURITY.md for the responsible disclosure policy.

License

AGPL-3.0-or-later. See LICENSE.