These docs are intentionally concise because Bluefin aims to stay out of the way. The goal is to give contributors and users a short, opinionated reference for the parts of the Bluefin experience that are unique to this project.
- Node.js 20+ — see
package.jsonenginesfield (node >=20is required) just—brew install justorcargo install justGITHUB_TOKENorGH_TOKEN— required for data-fetch scripts that call the GitHub API (a fine-grained token with read-only public repo access is sufficient)
This repository contains the Docusaurus site for Project Bluefin documentation. It combines end-user docs, contributor-facing project guidance, release notes, and generated data that powers dynamic pages like downloads, changelogs, and version dashboards.
docs/contains the main documentation pages, including installation, troubleshooting, downloads, contributor guidance, developer experience, and FAQ content.blog/contains release posts, announcements, status updates, and longer-form project storytelling.static/contains assets served as-is, plus generated JSON data consumed by the site.scripts/contains the fetch and generation scripts that build the data files used across the docs site.
New contributors usually want one of these starting points:
docs/installation.md,docs/introduction.md, anddocs/downloads.mdxfor core end-user onboarding contentdocs/tips.mdx,docs/troubleshooting.mdx, anddocs/FAQ.mdfor support-oriented docsdocs/contributing.md,docs/devcontainers.md, anddocs/local.mdfor contributor and developer workflow docsblog/for release history, announcements, and project updates
- Prefer linking upstream documentation with a short Bluefin-specific summary when the upstream project already owns the canonical docs.
- Use this repo for Bluefin-specific workflows, defaults, policy, release information, and project guidance.
- If something is undocumented, assume there may be a reason; check nearby docs and existing patterns before adding new content.
This site covers Bluefin-specific workflows, defaults, and project guidance. Generic GNOME, Fedora, or upstream-tooling documentation should usually stay upstream, with this site linking out and adding only the Bluefin-specific context contributors need.
docs/contains the main documentation pages for users and contributors.blog/contains release posts, announcements, and longer-form updates.static/contains unprocessed assets like images and other files served as-is by Docusaurus.- New docs pages should include Docusaurus frontmatter with at least
titleandslug;sidebar_positionis recommended for pages that belong in a sidebar, for example:
---
title: My Page
slug: /my-page
sidebar_position: 1
---- For the broader Bluefin contribution workflow, start with
docs/contributing.md.
This project uses just as a command runner for convenience.
Install it with brew install just or cargo install just.
just serve: Fetch all remote data, then build and serve the documentation locally.just dev: Fast hot-reload dev server — skips data fetching (runjust serveonce first to populate the cache).just build: Full production build (also fetches data).
Note:
just serveandnpm run startrun data-fetch scripts that call the GitHub API. SetGITHUB_TOKEN(orGH_TOKEN) in your environment to avoid rate-limit errors:export GITHUB_TOKEN=ghp_your_token_here just serveA fine-grained token with read-only public repository access is sufficient.
Manual setup
You've made some changes and want to see how they look?
You can install node and run it:
npm install --legacy-peer-deps
npm run start
Note: The
--legacy-peer-depsflag is required due to peer dependency conflicts between React versions. If you encounter "Cannot find module" errors (likexml2js), make sure you're using this flag during installation.
Alternatively, you can run the container:
docker compose up
Then make sure to format all your files with Prettier!
npm run prettier
The documentation repo also hosts the public CountMe endpoint at https://countme.projectbluefin.io/.
This service is a small Cloudflare Worker that serves CountMe chart images and accepts telemetry pings for Dakota.
- Serves CountMe chart SVGs for the root host and a few compatibility paths.
- Accepts
/metalinkGET requests from telemetry clients. - Returns a placeholder SVG when the Project Bluefin chart artifact is not yet available from
projectbluefin/countme.
workers/countme-proxy/index.mjs— Worker implementationwrangler.countme.toml— Wrangler config and route bindingscripts/countme-worker.test.js— regression tests for the worker behavior
The worker is deployed as a Cloudflare Worker behind the countme.projectbluefin.io hostname.
Deployment is done with Wrangler from this repo:
cd /var/home/jorge/src/documentation
npx wrangler deploy --config wrangler.countme.tomlThe worker is attached to the projectbluefin.io zone via the route configured in wrangler.countme.toml.
- Make code changes in
workers/countme-proxy/index.mjs. - Add or update coverage in
scripts/countme-worker.test.js. - Run the focused checks:
cd /var/home/jorge/src/documentation
node --test scripts/countme-worker.test.js
npx eslint workers/countme-proxy/index.mjs scripts/countme-worker.test.js- Deploy the worker:
cd /var/home/jorge/src/documentation
npx wrangler deploy --config wrangler.countme.toml- Smoke-test the live service:
curl -i 'https://countme.projectbluefin.io/metalink?repo=dakota&tag=latest&flavor=default&arch=x86_64&countme=3'
curl -i 'https://countme.projectbluefin.io/growth.svg'
curl -i 'https://countme.projectbluefin.io/'This service is intentionally lightweight and public-facing. Current characteristics:
- No secrets, database, or authentication layer.
- No private user data is processed.
- Only
GETandHEADmethods are accepted for the public endpoints. - The worker fetches public upstream SVGs from GitHub raw URLs and returns a brief placeholder SVG when the Project Bluefin artifact is not yet available.
- Cloudflare TLS and route protection provide the baseline edge security; the worker itself is not currently protected by API auth or per-client access controls.
Maintenance expectations:
- Keep the worker logic simple and dependency-light.
- Prefer updating the upstream source mapping and fallback behavior in the repo over making dashboard-only changes.
- Re-run tests before every deployment.
- If the upstream artifact becomes available from
projectbluefin/countme, update the worker to prefer it for the root-hosted chart routes. - If operational abuse or telemetry misuse appears, add rate limiting and request validation before expanding the endpoint surface.
- The source of truth is the repository, not the Cloudflare dashboard.
- Any change to behavior, route mapping, fallback content, or telemetry handling should be made in the repo and deployed with Wrangler.
- Rollbacks should be handled by redeploying an earlier known-good worker version from the repo or from Wrangler deployment history.
If you encounter this error when running npm run start:
Error: Cannot find module 'xml2js'
This is typically caused by peer dependency conflicts during installation. To resolve:
- Remove existing node_modules:
rm -rf node_modules - Install with legacy peer deps:
npm install --legacy-peer-deps - Try running the command again:
npm run start