{"id":50106125,"url":"https://github.com/oxoyo/stars","last_synced_at":"2026-05-25T12:01:02.769Z","repository":{"id":359487621,"uuid":"1243080507","full_name":"OXOYO/stars","owner":"OXOYO","description":"stars：一键生成 GitHub Star 可视化站点 —— Built entirely by AI","archived":false,"fork":false,"pushed_at":"2026-05-24T06:48:30.000Z","size":809,"stargazers_count":2,"open_issues_count":1,"forks_count":1,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-05-24T11:02:15.657Z","etag":null,"topics":["github","github-pages","stars"],"latest_commit_sha":null,"homepage":"http://oxoyo.github.io/stars","language":"Vue","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/OXOYO.png","metadata":{"files":{"readme":"README.en.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","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-05-19T03:08:35.000Z","updated_at":"2026-05-24T06:46:50.000Z","dependencies_parsed_at":"2026-05-24T11:01:05.051Z","dependency_job_id":null,"html_url":"https://github.com/OXOYO/stars","commit_stats":null,"previous_names":["oxoyo/stars"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/OXOYO/stars","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/OXOYO%2Fstars","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/OXOYO%2Fstars/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/OXOYO%2Fstars/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/OXOYO%2Fstars/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/OXOYO","download_url":"https://codeload.github.com/OXOYO/stars/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/OXOYO%2Fstars/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33473706,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-25T06:32:55.349Z","status":"ssl_error","status_checked_at":"2026-05-25T06:32:35.322Z","response_time":57,"last_error":"SSL_read: 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":["github","github-pages","stars"],"created_at":"2026-05-23T10:39:03.109Z","updated_at":"2026-05-25T12:01:02.759Z","avatar_url":"https://github.com/OXOYO.png","language":"Vue","funding_links":[],"categories":[],"sub_categories":[],"readme":"# stars: GitHub Star visualization site in one fork\n\n**[中文](README.md)**\n\nFork and go: fetch your starred repositories, build a Vue SPA, and deploy to GitHub Pages. The UI supports **Simplified Chinese / English** (header toggle or `?lang=en`).\n\n---\n\n## Quick start (fork \u0026 deploy)\n\nFor users who only want their own Star site without changing code:\n\n1. **Fork** this repository to your account.\n2. On the fork dialog, enable **Copy the DEFAULT branch only** so you do not copy the upstream `gh-pages` branch. If you copy all branches, your first successful CI run will overwrite `gh-pages` anyway.\n3. In the forked repo: **Settings → Actions → General** — allow Actions to run (org policies may apply).\n4. **First deploy (required)** — forking alone **does not** start CI; trigger it once yourself:\n   - Recommended: **Actions** → **Build and Deploy My Stars** → **Run workflow** → branch **`main`** → **Run workflow**, then wait for a green check (about 1–5 minutes; longer with many stars).\n   - Alternatives: **push** any commit to `main` (also triggers CI; see **Automatic deployment** below), or wait for the **daily 00:00 UTC** schedule (still run manually the first time).\n5. After a successful workflow run, check **Settings → Pages**: source should be **`gh-pages` branch / root** (set up by `peaceiris/actions-gh-pages` after the first green run).\n6. Open: `https://\u003cyour-username\u003e.github.io/\u003crepo-name\u003e/` (Pages may take another 1–2 minutes to go live).\n\nCI uses **`github.repository_owner`** and the **current repository name** to fetch stars and build. You usually **do not need to change scripts**. Optionally edit `config.json` at the repo root for site title, default sort, etc.\n\n### Automatic deployment (GitHub Actions)\n\n| Trigger             | Description                                            |\n| ------------------- | ------------------------------------------------------ |\n| **push to `main`**  | Runs only when `generate.js`, `config.json`, `package*.json`, `web/**`, or this workflow changes (**README-only pushes do not trigger**) |\n| **Daily 00:00 UTC** | Scheduled sync of latest stars                         |\n| **Manual**          | Actions → _Build and Deploy My Stars_ → _Run workflow_ |\n\nPipeline: `generate` (GitHub API → `stars.json`) → `build:pages` (Vue → `web/dist`) → push to **`gh-pages`** (not `main`).\n\n### Fork notes\n\n- **No deploy on fork alone**: complete step 4 above (manual Run workflow or push) before your site shows your own stars.\n- **`main` has no build artifacts**: `web/dist`, `web/public/stars.json`, and `site.json` are gitignored.\n- **If you forked upstream `gh-pages`**: Pages may briefly show the upstream site until your workflow succeeds; run CI once or delete `gh-pages` on your fork and redeploy.\n- **Renaming the repo**: CI updates `owner` / `repoName` in data and the Pages base path; change `pageConfig.siteName` in `config.json` yourself if you want a new title.\n\n### Custom domain (GitHub Pages)\n\nAfter you add a custom domain under **Settings → Pages**, the site is usually served at the **domain root** (`https://your-domain/`), not `https://\u003cuser\u003e.github.io/\u003crepo-name\u003e/`.\n\nCI `build:pages` reads **`deployConfig.pagesBase`** in `config.json` for the asset prefix (Vite `base`). The app loads `stars.json`, `site.json`, and bundles under that prefix.\n\n| `pagesBase`        | URL you use                               | Notes                                      |\n| ------------------ | ----------------------------------------- | ------------------------------------------ |\n| `\"repo\"` (default) | `https://\u003cuser\u003e.github.io/\u003crepo-name\u003e/`   | Prefix `/\u003crepo-name\u003e/`; default fork setup |\n| `\"root\"`           | Custom domain root `https://your-domain/` | Prefix `/`; use with a custom domain       |\n\n**Impact on features**: Filtering, UI languages, `?lang=en`, and CI star fetching are unchanged. A mismatched `pagesBase` usually causes **404s for assets or JSON** (blank page or endless loading).\n\n**Custom domain steps**:\n\n1. Configure the domain and DNS under **Settings → Pages** (HTTPS via GitHub).\n2. Edit `config.json`: set `\"deployConfig\": { \"pagesBase\": \"root\", ... }`.\n3. Push to `main` or run the workflow to **rebuild and deploy** (DNS alone is not enough).\n\nFor the default `*.github.io/\u003crepo-name\u003e/` URL, keep `\"pagesBase\": \"repo\"` — no other changes.\n\n---\n\n## Local development\n\n### Requirements\n\n- Node.js **20+**\n- Git (to resolve `origin` and repo name)\n- **`GITHUB_TOKEN` strongly recommended** for large star lists (~60 req/hour/IP unauthenticated vs ~5000/hour authenticated)\n\nCreate a [GitHub Personal Access Token](https://github.com/settings/tokens), then export it (use the block for your OS):\n\n```bash\n# macOS / Linux\nexport GITHUB_TOKEN=ghp_your_token\n```\n\n```powershell\n# Windows PowerShell\n$env:GITHUB_TOKEN=\"ghp_your_token\"\n```\n\n```cmd\n# Windows CMD\nset GITHUB_TOKEN=ghp_your_token\n```\n\n\u003e **Cross-platform note:** `OWNER=xxx npm run ...` works on **macOS / Linux / Git Bash** only. On **PowerShell** use `$env:OWNER=\"xxx\"; npm run ...`; on **CMD** use `set OWNER=xxx \u0026\u0026 npm run ...`. All env-var examples below list all three.\n\n### Which user’s stars are fetched?\n\n| Scenario                     | Behavior                                                                                     |\n| ---------------------------- | -------------------------------------------------------------------------------------------- |\n| Clone **your fork**          | Username from `origin` ✅                                                                    |\n| Clone **upstream tool repo** | Does **not** fetch upstream author’s stars; tries `OWNER` → `GITHUB_TOKEN` → `gh auth login` |\n| CI / Actions                 | Uses `github.repository_owner` ✅                                                            |\n\n### Day-to-day dev (HMR)\n\n```bash\nnpm install\nnpm run dev\n```\n\nOpen **http://localhost:4173/**. `dev` runs `generate` then Vite.\n\nThe dev server listens on your LAN (`host: true`). The terminal prints a **Network** URL (e.g. `http://192.168.x.x:4173/`) for phones or other devices on the same Wi‑Fi (allow port **4173** in your firewall).\n\n**UI-only work** (skip API fetch):\n\n```bash\nnpm run dev:ui\n```\n\nRequires existing `web/public/stars.json` (run `npm run generate` once first).\n\nOverride owner (optional):\n\n```bash\n# macOS / Linux / Git Bash\nOWNER=your-username npm run generate\nGITHUB_TOKEN=ghp_xxx npm run generate\n```\n\n```powershell\n# Windows PowerShell\n$env:OWNER=\"your-username\"; npm run generate\n$env:GITHUB_TOKEN=\"ghp_xxx\"; npm run generate\n```\n\n```cmd\n# Windows CMD\nset OWNER=your-username \u0026\u0026 npm run generate\nset GITHUB_TOKEN=ghp_xxx \u0026\u0026 npm run generate\n```\n\n\u003e Dev port **4173** (localhost + LAN). Stop it: `npm run dev:stop` (macOS / Linux / Windows).\n\n### `REPO_NAME` and Pages base path\n\n`REPO_NAME` is your **GitHub repository name** (e.g. after a fork you rename the repo to `my-stars`, use `my-stars`), not your GitHub username.\n\n| Scenario                                  | Who sets `REPO_NAME`                                |\n| ----------------------------------------- | --------------------------------------------------- |\n| **GitHub Actions**                        | Automatically: `github.event.repository.name`       |\n| **Local `build:pages` / `preview:pages`** | Must match production; defaults to `stars` if unset |\n\nWith `deployConfig.pagesBase` set to `\"repo\"`, the build uses `/\u003cREPO_NAME\u003e/` as the asset prefix. That must match the repo segment in `https://\u003cuser\u003e.github.io/\u003crepo-name\u003e/`. If you **renamed the repo** after forking, set it explicitly when testing locally:\n\n```bash\n# macOS / Linux / Git Bash\nREPO_NAME=your-repo-name npm run build:pages\nREPO_NAME=your-repo-name npm run preview:pages\n```\n\n```powershell\n# Windows PowerShell\n$env:REPO_NAME=\"your-repo-name\"; npm run build:pages\n$env:REPO_NAME=\"your-repo-name\"; npm run preview:pages\n```\n\n```cmd\n# Windows CMD\nset REPO_NAME=your-repo-name \u0026\u0026 npm run build:pages\nset REPO_NAME=your-repo-name \u0026\u0026 npm run preview:pages\n```\n\n`npm run preview` (plain `build`) uses `base=/` and does **not** need `REPO_NAME`. With `pagesBase: \"root\"` (custom domain), the prefix is `/` and repo name path does not apply.\n\n### Pre-release checks\n\n| Command                 | Purpose                                                            |\n| ----------------------- | ------------------------------------------------------------------ |\n| `npm run preview`       | `base=/` — local data and build                                    |\n| `npm run preview:pages` | `base=/\u003cREPO_NAME\u003e/` (or `pagesBase`) — **closer to GitHub Pages** |\n\nBoth: `generate` + matching `build` + `vite preview` (port 4173). If your repo is not named `stars`, set `REPO_NAME` as above.\n\n### Scripts\n\n| Command                 | Description                                  |\n| ----------------------- | -------------------------------------------- |\n| `npm run dev`           | Fetch stars + Vite (`:4173`, HMR)            |\n| `npm run dev:ui`        | Vite only, no fetch                          |\n| `npm run dev:stop`      | Free port **4173** (cross-platform)          |\n| `npm run generate`      | Write `web/public/stars.json`, `site.json`   |\n| `npm run build`         | Local build (`base=/`)                       |\n| `npm run build:pages`   | GitHub Pages build (`base` from `pagesBase`) |\n| `npm run preview`       | generate + build + preview                   |\n| `npm run preview:pages` | generate + build:pages + preview             |\n\n---\n\n## Site features\n\nGitHub Stars–like browsing; one `stars.json`; filtering in the browser:\n\n| Feature          | Description                                                                                        |\n| ---------------- | -------------------------------------------------------------------------------------------------- |\n| **Search**       | Repo name \u0026 description; `#vue` for exact topic filter (AND for multiple, e.g. `#vue #typescript`) |\n| **Type**         | All / Sources / Forks                                                                              |\n| **Language**     | Sidebar list with counts                                                                           |\n| **License**      | Filter by SPDX license                                                                             |\n| **Starred year** | Filter by year you starred                                                                         |\n| **Sort**         | Recently starred / Recently active / Most stars                                                    |\n| **Virtual list** | Smooth scrolling for thousands of items                                                            |\n| **Stats**        | Totals, language/license breakdown, etc.                                                           |\n\n### UI languages (site chrome)\n\n- Header **中文 / EN** toggle.\n- URL: `?lang=en` for English; default Chinese unless `defaultUiLocale` in `config.json` says otherwise.\n- Star data is shared; UI locale does not duplicate `stars.json`.\n\n### URL parameters (shareable filter state)\n\n| Param           | Description                                           |\n| --------------- | ----------------------------------------------------- |\n| `lang`          | UI: `en` = English; omit = Chinese                    |\n| `stars-q`       | Search; `#topic` for topic filter                     |\n| `stars-lang`    | Programming language                                  |\n| `stars-license` | License                                               |\n| `stars-year`    | Year starred                                          |\n| `stars-type`    | `sources` / `forks`                                   |\n| `stars-sort`    | `recently_starred` / `recently_active` / `most_stars` |\n\n---\n\n## Performance\n\n| Stage   | Approach                                                     |\n| ------- | ------------------------------------------------------------ |\n| Data    | Single `stars.json` fetch (~1–2MB for ~3k stars)             |\n| List    | `@tanstack/vue-virtual` — visible rows only                  |\n| Filters | In-memory filter/sort; debounced search (`searchDebounceMs`) |\n\nFor very large lists, set `pageConfig.maxItems` in `config.json` or tune `virtualRowHeight`.\n\n---\n\n## Configuration (`config.json`)\n\n| Key                                         | Description                                                          | Default            |\n| ------------------------------------------- | -------------------------------------------------------------------- | ------------------ |\n| `pageConfig.siteName`                       | Site title (not auto-updated on rename)                              | `Stars`            |\n| `pageConfig.defaultUiLocale`                | Default UI: `zh-CN` / `en`                                           | `zh-CN`            |\n| `pageConfig.defaultSort`                    | Default sort                                                         | `recently_starred` |\n| `pageConfig.maxItems`                       | Max stars written (`0` = no limit)                                   | `0`                |\n| `pageConfig.showLanguage`                   | Show language on cards                                               | `true`             |\n| `pageConfig.showStarsCount`                 | Show star count on cards                                             | `true`             |\n| `pageConfig.showLicense`                    | Show license on cards                                                | `true`             |\n| `pageConfig.virtualRowHeight`               | Virtual list row height                                              | `140`              |\n| `pageConfig.searchDebounceMs`               | Search debounce (ms)                                                 | `300`              |\n| `pageConfig.toolRepoOwner` / `toolRepoName` | Footer link to tool repo                                             | `OXOYO` / `stars`  |\n| `deployConfig.publishDir`                   | CI artifact dir on runner                                            | `web/dist`         |\n| `deployConfig.forceOrphan`                  | Orphan `gh-pages` deploy                                             | `true`             |\n| `deployConfig.pagesBase`                    | Asset prefix: `repo` = `/\u003crepo-name\u003e/`; `root` = `/` (custom domain) | `repo`             |\n\nAfter edits: **local** — `generate` / `dev` again; **online** — push to `main` or run the workflow manually.\n\n---\n\n## Project layout\n\n```\n.github/workflows/build.yml   # Build \u0026 deploy\nweb/                          # Vue 3 + Vite SPA\n  public/                     # stars.json, site.json (generated, not committed)\n  src/                        # Components, state, i18n, styles\ngenerate.js                   # GitHub Star API → JSON\nconfig.json                   # Page \u0026 deploy settings\npackage.json\n```\n\n### Branches \u0026 deployment\n\n- **`main`**: source and config only; **no** committed `web/dist` or generated JSON.\n- **`gh-pages`**: static site written by CI for GitHub Pages.\n- `deployConfig.publishDir` is the **upload folder on the CI runner**, not a path committed on `main`.\n\n---\n\n## License\n\n[MIT License](LICENSE)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Foxoyo%2Fstars","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Foxoyo%2Fstars","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Foxoyo%2Fstars/lists"}