{"id":43335378,"url":"https://github.com/alternbits/opendata","last_synced_at":"2026-02-07T05:00:26.510Z","repository":{"id":335857709,"uuid":"1146899027","full_name":"alternbits/opendata","owner":"alternbits","description":"Template project for Altern sources","archived":false,"fork":false,"pushed_at":"2026-02-01T22:56:42.000Z","size":27,"stargazers_count":5,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2026-02-05T13:25:36.358Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/alternbits.png","metadata":{"files":{"readme":"readme.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":null,"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":null,"dco":null,"cla":null}},"created_at":"2026-01-31T21:28:19.000Z","updated_at":"2026-02-03T10:50:13.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/alternbits/opendata","commit_stats":null,"previous_names":["alternbits/opendata"],"tags_count":5,"template":false,"template_full_name":null,"purl":"pkg:github/alternbits/opendata","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/alternbits%2Fopendata","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/alternbits%2Fopendata/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/alternbits%2Fopendata/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/alternbits%2Fopendata/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/alternbits","download_url":"https://codeload.github.com/alternbits/opendata/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/alternbits%2Fopendata/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29149575,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-06T02:39:25.012Z","status":"ssl_error","status_checked_at":"2026-02-06T02:37:22.784Z","response_time":59,"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":[],"created_at":"2026-02-02T00:26:21.843Z","updated_at":"2026-02-06T04:00:38.673Z","avatar_url":"https://github.com/alternbits.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Altern Open Data\n\n**Repo:** [github.com/alternbits/opendata](https://github.com/alternbits/opendata)\n\nData-driven awesome list. Edit YAML, run the compiler, get markdown.\n\n## Use as a GitHub Action\n\nUse this in **any repo** to validate and compile your awesome list. No need to copy the compiler.\n\n### 1. Create your repo layout\n\n```\nyour-repo/\n├── data/\n│   └── example.yml\n├── meta/\n│   ├── info.yml\n│   └── categories.yml\n├── config.yml          # Optional\n└── .github/workflows/validate.yml\n```\n\n### 2. Add meta files\n\n**`meta/info.yml`** — List title, description, badges:\n```yaml\nname: Awesome Tools\ndescription: A curated list of awesome tools.\nbadges:\n  - url: https://awesome.re/badge.svg\n    link: https://awesome.re\nposition_order:\n  - featured\n  - popular\n  - ordinary\n```\n\n**`meta/categories.yml`** — Categories for your list:\n```yaml\n- id: tools\n  name: Tools\n- id: resources\n  name: Resources\n```\n\n### 3. Add data files\n\nOne file per item in `data/`. Filename = slug (e.g. `my-tool.yml`).\n\n**`data/my-tool.yml`**:\n```yaml\nname: My Tool\nslug: my-tool\nurl: https://example.com\noneliner: A great tool for developers.\nmain_category: tools\nposition: featured\ndate_added: 2025-02-01\n```\n\n### 4. Add the workflow\n\n**`.github/workflows/validate.yml`**:\n```yaml\nname: Validate and compile\non:\n  push:\n    branches: [main]\n  pull_request:\n    branches: [main]\njobs:\n  validate:\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions/checkout@v4\n      - uses: alternbits/opendata@v1\n```\n\nWith custom inputs:\n```yaml\n      - uses: alternbits/opendata@v1\n        with:\n          data-dir: data\n          meta-dir: meta\n          fail-if-outdated: 'true'\n```\n\n### 5. Optional: config.yml\n\nSet output filename (default is `readme.md`):\n```yaml\noutput: LIST.md\n```\n\n### Action inputs\n\n| Input | Default | Description |\n|-------|---------|-------------|\n| `data-dir` | `data` | Directory with data YAML files |\n| `meta-dir` | `meta` | Directory with info.yml and categories.yml |\n| `fail-if-outdated` | `true` | Fail if generated file differs from committed |\n\n### What the action does\n\n1. Builds the compiler\n2. Reads `data/`, `meta/`, and optional `config.yml` from your repo\n3. Validates YAML structure and category references\n4. Writes the generated list (e.g. `readme.md`)\n5. Fails if the file changed (so you know to commit the update)\n\n---\n\n## What it is\n\n- Curated list content lives in **YAML**, not in the readme.\n- A **Go compiler** reads that YAML and writes the list (e.g. `readme.md` or whatever you set).\n- You change **data** and **meta**; the readme is generated.\n\n## Layout\n\n- **`template/`** — Standalone test template (separate project). Has everything a consumer repo needs: `data/`, `meta/`, `config.yml`, `.github/workflows/validate.yml` (uses the action), `README.md`, `CONTRIBUTING.md`, `.gitignore`, and the generated `readme-sample.md`. Copy this folder into a new repo to start an awesome list; no compiler required.\n- **`compiler/`** — Go app. Builds from `data/` + `meta/`, validates, then writes the list.\n\n## How to run\n\n```bash\nmake run\n```\n\nBuilds the compiler and runs it on **`template/`** (writes `template/readme-sample.md`).  \nTo run on another dir: `make build` then `cd your-dir \u0026\u0026 ../compiler/bin/compile`. Use `-data`, `-meta`, `-out` to override paths.\n\n## CI\n\nRoot workflow runs the compiler on `template/` and fails if `template/readme-sample.md` is out of date.\n\n## Docs\n\n- **CONTRIBUTING.md** — Data format, meta fields, how to add entries and badges.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Falternbits%2Fopendata","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Falternbits%2Fopendata","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Falternbits%2Fopendata/lists"}