{"id":38115375,"url":"https://github.com/technical-1/git-archiver-web","last_synced_at":"2026-06-07T09:01:23.844Z","repository":{"id":332513653,"uuid":"1134031388","full_name":"Technical-1/Git-Archiver-Web","owner":"Technical-1","description":"Free GitHub repository archive service - backup any public repo forever","archived":false,"fork":false,"pushed_at":"2026-05-25T07:20:49.000Z","size":2091,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-05-25T09:28:57.034Z","etag":null,"topics":["archive","backup","git","github","preservation"],"latest_commit_sha":null,"homepage":"https://technical-1.github.io/Git-Archiver-Web/","language":"JavaScript","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/Technical-1.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"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-14T06:36:16.000Z","updated_at":"2026-05-24T06:45:04.000Z","dependencies_parsed_at":"2026-01-20T06:01:50.421Z","dependency_job_id":"39d85e55-997e-4a17-8391-9bb8db808641","html_url":"https://github.com/Technical-1/Git-Archiver-Web","commit_stats":null,"previous_names":["technical-1/git-archiver-web"],"tags_count":486,"template":false,"template_full_name":null,"purl":"pkg:github/Technical-1/Git-Archiver-Web","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Technical-1%2FGit-Archiver-Web","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Technical-1%2FGit-Archiver-Web/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Technical-1%2FGit-Archiver-Web/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Technical-1%2FGit-Archiver-Web/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Technical-1","download_url":"https://codeload.github.com/Technical-1/Git-Archiver-Web/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Technical-1%2FGit-Archiver-Web/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33725060,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-05-31T02:00:06.040Z","response_time":95,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"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":["archive","backup","git","github","preservation"],"created_at":"2026-01-16T22:17:34.535Z","updated_at":"2026-05-31T09:00:48.156Z","avatar_url":"https://github.com/Technical-1.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Git-Archiver Web\n\nA free, serverless web service for archiving public GitHub repositories. Paste a repo URL, get a permanent `.tar.gz` snapshot hosted on GitHub Releases.\n\nThe whole stack runs on free tiers: a vanilla-JS frontend on GitHub Pages, a Cloudflare Worker proxy that keeps the GitHub token off the client, and a GitHub Actions workflow that clones, compresses, and publishes the archive. No accounts, no servers, no database.\n\n## Features\n\n- **One-click archiving** — paste a `github.com/owner/repo` URL and the worker queues a job by opening a labelled issue on the archive repo\n- **Bulk submit** — submit up to 20 repos at once\n- **Content-addressed dedupe** — each archive's SHA-256 is stored in metadata; a re-archive that matches the previous hash is skipped instead of creating a duplicate release\n- **Live source-status badges** — repo cards show whether the original GitHub repo is still public, deleted, or private\n- **README preview** — the worker proxies the archived README so it renders in the detail modal without CORS pain\n- **Daily refresh job** — `update-archives.yml` re-checks the oldest entries and re-archives only those that changed\n- **Searchable index** — `index.json` is a single release asset listing every archived repo, fetched once and filtered client-side\n\n## Tech Stack\n\n- **Frontend**: HTML/CSS + vanilla JavaScript (no framework, no build step), deployed to GitHub Pages\n- **API proxy**: Cloudflare Workers (V8 runtime), managed with Wrangler 3\n- **Archive engine**: GitHub Actions (`archive.yml`, ~800 lines of workflow)\n- **Storage**: GitHub Releases — `.tar.gz` + `metadata.json` + extracted `README.md` per archive, plus a single `index` release holding the master `index.json`\n\n## Getting Started\n\n### Prerequisites\n\n- Node.js 18+\n- A Cloudflare account (free tier is enough)\n- A GitHub account and a Personal Access Token with `repo` scope\n\n### Local development\n\n```bash\n# Frontend — any static server works\ncd frontend\nnpx serve .\n\n# Worker\ncd worker\nnpm install\nnpx wrangler dev\n```\n\n### Deployment\n\n```bash\n# Deploy the worker\ncd worker\nnpx wrangler deploy\n\n# Frontend deploys automatically via pages.yml on push to main\n```\n\nThe worker needs three secrets set via `wrangler secret put`: `GITHUB_TOKEN`, `GITHUB_OWNER`, and `GITHUB_REPO`.\n\n## Project Structure\n\n```\ngit-archiver-web/\n├── frontend/           # Static site served by GitHub Pages\n│   ├── index.html\n│   ├── about.html\n│   ├── css/\n│   └── js/             # app.js, api.js, utils.js\n├── worker/             # Cloudflare Worker (submission proxy)\n│   └── src/index.js\n├── .github/workflows/\n│   ├── archive.yml         # archive engine, triggered by issue label\n│   ├── update-archives.yml # daily re-archive job\n│   └── pages.yml           # frontend deploy\n└── scripts/            # setup and index-recovery scripts\n```\n\n## Limits\n\n| Limit | Value |\n|-------|-------|\n| Max repo size | 2 GB (GitHub Release asset cap) |\n| Submissions per IP/hour | 10 (configurable via Cloudflare KV) |\n| Clone depth | 100 commits (speed vs. history trade-off) |\n| Private repos | Not supported — public only |\n\n## License\n\nMIT\n\n## Author\n\nJacob Kanfer — [GitHub](https://github.com/Technical-1)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftechnical-1%2Fgit-archiver-web","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ftechnical-1%2Fgit-archiver-web","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftechnical-1%2Fgit-archiver-web/lists"}