An open observatory for discovering projects and repositories across the Stellar ecosystem.
Overview · Explore the ecosystem · How it works · Tech stack · Getting started · Project structure · Development · Contributing · License · Credits
ATLAS turns a public directory of Stellar projects into a catalog you can actually browse. Instead of a flat list of links, every repository arrives with the project it belongs to, the programs that funded or hosted it, the language it is written in, and the person or organization behind it.
It is built for developers looking for prior art before starting something new, for builders trying to find collaborators or adjacent work, and for researchers and anyone mapping what the Stellar ecosystem has actually produced.
The catalog is a static JSON snapshot loaded at runtime. ATLAS does not call the GitHub API from the browser and does not track visitors. What the source does not publish is left empty rather than estimated: a missing star count stays null, never 0.
| Capability | Description |
|---|---|
| Full-text search | Matches repository name, description, project, organization, builder, language, category and country in a single query. |
| Filters | Funding program, category, primary language and status. |
| Sorting | Last commit, stars, or alphabetical. |
| List and grid views | Two densities for the same result set. |
| Pagination | 24, 48 or 96 entries per page. |
| Shareable state | Search, filters, sorting, view and page are written to the URL query string. |
| Repository detail | A dialog with the project, funding, hackathon builds and related repositories; deep-linkable via ?repo=<slug>. |
Everything above operates on the snapshot in web/public/data/catalog.json. There are no accounts, favorites or background sync.
ATLAS is split into two halves that meet at a JSON file.
The build side is a set of Node scripts that read the raw source data, normalize it, and write a compact snapshot. The runtime side is a React single-page app that fetches that snapshot once and does all filtering, sorting and pagination in memory.
flowchart LR
A[Source data<br/>NDJSON / JSON] --> B[scripts/extract-catalog.mjs]
B --> C[public/data/catalog.json]
C --> D[src/lib/catalog.ts<br/>filter · sort · paginate]
D --> E[Explorer UI]
F[URL query string] <--> D
src/lib/catalog.ts is the only place the raw shape is interpreted: it maps source records to the Repository model, derives categories and programs, and resolves the builder attribution. The UI components never touch raw fields.
| Technology | Role |
|---|---|
| React 18 | UI layer |
| TypeScript 5.6 | Types and build-time checking |
| Vite 5 | Dev server and production bundler |
| Tailwind CSS 3.4 | Styling, with the Tellus Cooperative palette in tailwind.config.js |
| lucide-react | Icons |
| motion | Animation |
| @paper-design/shaders-react | Dithering backdrop |
| Node.js | Data extraction scripts (ESM) |
- Node.js
^18.0.0 || >=20.0.0(required by Vite 5) - npm (the repository ships a
package-lock.json)
git clone https://github.com/Klorenn/ATLAS.git
cd ATLAS/webnpm installnpm run devThe app is served at http://localhost:3002. No configuration or environment variables are needed: the catalog is read from public/data/catalog.json, which is committed.
npm run build
npm run previewbuild runs tsc --noEmit before vite build, so a type error fails the build. Output goes to web/dist/, with base: './', so the bundle can be served from any subpath.
npm run data
scripts/extract-catalog.mjsreads the raw dataset from adata/directory three levels aboveweb/. That dataset lives in the Tellus Cooperative roadmap workspace and is not part of this repository, so runningnpm run dataoutside that workspace will fail. Day-to-day development does not need it: the generated snapshot is already committed.
npm run passportscripts/fetch-passport.mjs reads Stellar Passport (hackathons, builder profiles, projects, and the repositories each project files) and writes web/public/data/passport.json, which the /add page uses to match a repository against known builders and projects. The committed snapshot is enough for development; re-run only to refresh it.
Projects and repositories live at the top level of the snapshot, not nested inside builders. A project is keyed by builderLogin/slug because the slug alone is not unique across builders, and a repository is keyed by full_name because one repository can belong to more than one project. /add resolves a repository by name, which attributes better than the GitHub owner: the owner is frequently the organization, while the declared builder is the person responsible for the project.
To promote the declared repositories into the catalog, run the classic merge from the roadmap root after refreshing the snapshot:
node scripts/merge-passport-repos.mjs # appends missing repos + builders to the canonical collections
node scripts/validate-data.mjs
node scripts/build-app-catalog.mjs
cd tellus-atlas/web && npm run dataThe merge is idempotent and only adds repositories Passport declares that no other source already brought in (40 of 89 on the 2026-09-28 snapshot). New records carry source.type: "stellar-passport", associationEvidence: "curado", stay linked to the Passport project slug, and leave lastCommitAt as null — Passport does not publish update dates.
It needs a Passport API key in a .env at the repository root:
PASSPORT_API_KEY=pk_...Two constraints shape where this runs. Passport sends no CORS headers, on the GET or on the OPTIONS preflight, so the browser cannot call it. And pk_... is an organization bearer: in a Vite bundle it would be readable by anyone opening DevTools. So the sync runs in Node and publishes a file. GitHub is the opposite case: it allows CORS, so /add queries it directly from the browser and needs no key.
The current base URL is https://demo.stellarpassport.xyz/api/v1, a demo instance. Check what it holds before treating its contents as the real Passport population.
/add reads a GitHub path, proposes a category from the repository topics, and assembles a curated-additions.json entry with the programs, country, and builder you select. When Passport has the repository on record, it shows the declared project(s) and builder, and "Use this builder" attributes the entry to that person instead of the GitHub owner. Values the source does not publish stay null and render as "—"; a category suggestion is a suggestion, not a classification.
The page does not write to the repository. To publish an entry:
- Paste the generated block into
web/data/curated-additions.json, underrepositoriesand, if you named a builder,builders. - Run
npm run datato regenerateweb/public/data/catalog.json. - Commit both files.
curatedPrograms, curatedCountries, and curatedCategory add to what the source already says. They do not replace it: a repository curated as instawards keeps its hackathon badge, and a country from a hackathon build stays.
.
├── assets/readme/ Images used by this README
├── web/ The ATLAS application
│ ├── public/
│ │ ├── data/ Catalog snapshot (catalog.json, stats.json, passport.json)
│ │ └── logos/ Ecosystem logos used in the landing page
│ ├── scripts/ Node scripts that generate the snapshots
│ └── src/
│ ├── components/ Landing sections, the Explorer, and AddRepository
│ ├── lib/ catalog.ts (data model, filters, sorting, URL state)
│ │ curate.ts (GitHub analysis, entry assembly)
│ └── data.ts Static copy for the landing page
├── index.html Standalone page mounting the vanilla explorer
├── explorer.js
├── explorer.css Vanilla explorer component (no build step)
└── atlas.css
The files at the root are an earlier vanilla-JS explorer that runs without a bundler, useful for embedding the catalog in a plain HTML page. The React app under web/ is the primary experience.
| Command | What it does |
|---|---|
npm run dev |
Vite dev server on port 3002 |
npm run build |
Type check (tsc --noEmit) then production bundle |
npm run preview |
Serve the built bundle on port 3002 |
npm run data |
Regenerate public/data/catalog.json (needs the external dataset) |
There is no linter, formatter or test suite configured in this repository yet. npm run build is the only automated check: keep it green before opening a pull request.
Bug reports, ideas and code are welcome. Open an issue using the bug report or feature request template, or send a pull request.
Read CONTRIBUTING.md for the full workflow.
Released under the MIT License.
Project: Tellus Cooperative Creator: Klorenn
ATLAS is an independent community project. It is not affiliated with, or endorsed by, the Stellar Development Foundation.



