[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"project-2036":3},{"id":4,"name":5,"fullName":6,"owner":7,"repo":5,"description":8,"homepage":9,"htmlUrl":10,"language":11,"languages":10,"totalLinesOfCode":10,"stars":12,"forks":13,"watchers":14,"openIssues":15,"contributorsCount":16,"subscribersCount":16,"size":16,"stars1d":16,"stars7d":17,"stars30d":13,"stars90d":16,"forks30d":16,"starsTrendScore":16,"compositeScore":18,"rankGlobal":10,"rankLanguage":10,"license":19,"archived":20,"fork":20,"defaultBranch":21,"hasWiki":20,"hasPages":20,"topics":22,"createdAt":10,"pushedAt":10,"updatedAt":23,"readmeContent":24,"aiSummary":25,"trendingCount":16,"starSnapshotCount":16,"syncStatus":26,"lastSyncTime":27,"discoverSource":28},2036,"diffkit","stylessh\u002Fdiffkit","stylessh","A fast, design-first GitHub dashboard for developers who want to stay on top of their pull requests, issues, and code reviews — without the noise.","",null,"TypeScript",161,27,134,8,0,1,47.54,"MIT License",false,"main",[],"2026-06-12 04:00:13","# DiffKit\n\nA fast, design-first GitHub dashboard for developers who want to stay on top of their pull requests, issues, and code reviews — without the noise.\n\n> [!WARNING]\n> **Alpha** — DiffKit is in early release. Expect bugs, errors, and rough edges. Feedback and issue reports are welcome on [GitHub Issues](https:\u002F\u002Fgithub.com\u002Fstylessh\u002Fdiffkit\u002Fissues).\n\n## Features\n\n- **Pull Requests** — View, filter, and manage your open PRs across repos\n- **Issues** — Track assigned issues with labels, milestones, and status\n- **Code Reviews** — See pending review requests in one place\n- **PR Diff Viewer** — Review pull request changes with inline comments\n- **Dark Mode** — Full dark mode support out of the box\n- **Fast** — Deployed on Cloudflare Workers at the edge\n\n## Tech Stack\n\n| Layer | Technology |\n|-------|-----------|\n| Framework | TanStack Start (React 19) |\n| Routing | TanStack Router (file-based) |\n| Data | TanStack Query + Octokit |\n| Database | Cloudflare D1 (SQLite) via Drizzle ORM |\n| Auth | Better Auth with GitHub OAuth App + GitHub App |\n| Styling | Tailwind CSS 4 + Radix UI |\n| Icons | Lucide React |\n| Build | Vite 7 + Turborepo |\n| Runtime | Cloudflare Workers |\n| Linting | Biome |\n\n## Getting Started\n\n### Prerequisites\n\n- [Node.js](https:\u002F\u002Fnodejs.org\u002F) v20+\n- [pnpm](https:\u002F\u002Fpnpm.io\u002F) v10+\n\n### 1. Clone and install\n\n```bash\ngit clone https:\u002F\u002Fgithub.com\u002Fstylessh\u002Fdiffkit.git\ncd diffkit\npnpm install\n```\n\n### 2. Create a GitHub OAuth App\n\nThe OAuth App handles user login and broad-scope reads (`repo`, `read:org`, `user:email`). It's also the fallback for repositories where the GitHub App is not installed.\n\n1. Go to [GitHub OAuth App settings](https:\u002F\u002Fgithub.com\u002Fsettings\u002Fdevelopers) and click **New OAuth App**\n2. Fill in the form:\n   - **Application name**: DiffKit (local)\n   - **Homepage URL**: `http:\u002F\u002Flocalhost:3000`\n   - **Authorization callback URL**: `http:\u002F\u002Flocalhost:3000\u002Fapi\u002Fauth\u002Fcallback\u002Fgithub`\n3. Click **Register application**\n4. Copy the **Client ID**\n5. Click **Generate a new client secret** and copy it\n\nYou'll need both values for your `.dev.vars` file in step 5.\n\n### 3. Create a GitHub App\n\nThe GitHub App provides installation tokens for repo-scoped access, webhook delivery, and user-to-server tokens for installation discovery.\n\n1. Go to [GitHub App settings](https:\u002F\u002Fgithub.com\u002Fsettings\u002Fapps) and click **New GitHub App**\n2. Fill in the form:\n   - **GitHub App name**: DiffKit Dev (must be globally unique)\n   - **Homepage URL**: `http:\u002F\u002Flocalhost:3000`\n   - **Callback URL**: `http:\u002F\u002Flocalhost:3000\u002Fapi\u002Fgithub\u002Fapp\u002Fcallback`\n   - **Setup URL**: `http:\u002F\u002Flocalhost:3000\u002Fsetup`\n   - Check **Redirect on update**\n   - Leave **Request user authorization (OAuth) during installation** **unchecked**\n   - **Webhook URL**: leave blank for now (see [Local webhook testing](#local-webhook-testing) below)\n\n3. Under **Permissions**, grant the following:\n\n   | Category | Permission | Level |\n   |----------|-----------|-------|\n   | Repository | Metadata | Read-only |\n   | Repository | Pull requests | Read & write |\n   | Repository | Issues | Read & write |\n   | Repository | Checks | Read-only |\n   | Repository | Actions | Read-only |\n   | Repository | Contents | Read & write |\n   | Organization | Members | Read-only |\n   | Account | Email addresses | Read-only |\n\n4. Under **Subscribe to events**, enable:\n   - Check run\n   - Check suite\n   - Issue comment\n   - Issues\n   - Pull request\n   - Pull request review\n   - Pull request review comment\n   - Pull request review thread\n   - Status\n   - Repository ruleset\n   - Branch protection rule\n   - Workflow run\n\n5. Click **Create GitHub App**\n\n6. On the app settings page, note down:\n   - **App ID** (numeric, shown at the top)\n   - **Client ID** (starts with `Iv1.`)\n   - The **slug** from the app URL (`https:\u002F\u002Fgithub.com\u002Fapps\u002F\u003Cslug>`)\n\n7. Generate credentials:\n   - Click **Generate a new client secret** and copy it\n   - Under **Private keys**, click **Generate a private key** — a `.pem` file will download\n\n8. Convert the private key to a single-line format for `.dev.vars`:\n   ```bash\n   awk 'NF {printf \"%s\\\\n\", $0}' \u002Fpath\u002Fto\u002Fdownloaded-key.pem\n   ```\n   GitHub downloads PKCS#1 keys (`BEGIN RSA PRIVATE KEY`). DiffKit auto-converts to PKCS#8 at runtime.\n\n### 4. Install the GitHub App\n\n1. Go to your GitHub App's settings page → **Install App**\n2. Choose the user or organization you want DiffKit to access\n3. Select **All repositories** or pick specific ones\n4. Click **Install**\n\n### 5. Configure environment variables\n\nCopy the example file and fill in the values from steps 2–4:\n\n```bash\ncp apps\u002Fdashboard\u002F.dev.vars.example apps\u002Fdashboard\u002F.dev.vars\n```\n\nOpen `apps\u002Fdashboard\u002F.dev.vars` and fill in:\n\n```\n# From the OAuth App (step 2)\nGITHUB_OAUTH_CLIENT_ID=your_oauth_client_id\nGITHUB_OAUTH_CLIENT_SECRET=your_oauth_client_secret\n\n# From the GitHub App (step 3)\nGITHUB_APP_CLIENT_ID=Iv1.your_app_client_id\nGITHUB_APP_CLIENT_SECRET=your_app_client_secret\nGITHUB_APP_ID=123456\nGITHUB_APP_PRIVATE_KEY=\"-----BEGIN RSA PRIVATE KEY-----\\n...\\n-----END RSA PRIVATE KEY-----\\n\"\nGITHUB_APP_SLUG=your-app-slug\n\n# Webhook secret (set the same value in your GitHub App settings)\nGITHUB_WEBHOOK_SECRET=your_webhook_secret\n\n# Generate with: openssl rand -base64 32\nBETTER_AUTH_SECRET=your_random_secret_at_least_32_chars\nBETTER_AUTH_URL=http:\u002F\u002Flocalhost:3000\n```\n\n> DiffKit also accepts the legacy `GITHUB_CLIENT_ID` and `GITHUB_CLIENT_SECRET` names as a fallback for the OAuth App credentials.\n\n### 6. Run database migrations\n\n```bash\npnpm --filter dashboard migrate\n```\n\n### 7. Start the dev server\n\n```bash\npnpm dev\n```\n\nOpen [http:\u002F\u002Flocalhost:3000](http:\u002F\u002Flocalhost:3000) in your browser.\n\n### Local webhook testing\n\nTo receive GitHub webhooks locally, you need a public tunnel:\n\n1. Start a tunnel (e.g. with [ngrok](https:\u002F\u002Fngrok.com\u002F)):\n   ```bash\n   ngrok http 3000\n   ```\n2. Copy the public URL (e.g. `https:\u002F\u002Fabc123.ngrok-free.app`)\n3. Add it to `apps\u002Fdashboard\u002F.dev.vars`:\n   ```\n   DEV_TUNNEL_URL=https:\u002F\u002Fabc123.ngrok-free.app\n   ```\n4. In your GitHub App settings, set **Webhook URL** to:\n   ```\n   https:\u002F\u002Fabc123.ngrok-free.app\u002Fapi\u002Fwebhooks\u002Fgithub\n   ```\n5. Generate a **Webhook secret** and set the same value in both GitHub and your `.dev.vars`\n6. Restart the dev server\n\nThe dev server uses `DEV_TUNNEL_URL` to allow the tunnel host and configure HMR correctly.\n\n## Scripts\n\n| Command | Description |\n|---------|------------|\n| `pnpm dev` | Start all dev servers |\n| `pnpm build` | Build all packages and apps |\n| `pnpm lint` | Lint the codebase |\n| `pnpm check` | Run Biome checks |\n| `pnpm check-types` | Type-check all packages |\n| `pnpm format` | Format code with Biome |\n\n### Dashboard-specific scripts\n\n| Command | Description |\n|---------|------------|\n| `pnpm --filter dashboard migrate` | Run D1 migrations (local) |\n| `pnpm --filter dashboard migrate:remote` | Run D1 migrations (remote) |\n| `pnpm --filter dashboard test` | Run tests |\n| `pnpm --filter dashboard deploy` | Build and deploy to Cloudflare Workers |\n\n## GitHub App Permissions Reference\n\nExpanding permissions after users have installed the app will require those installations to approve the new permission set.\n\n\u003Cdetails>\n\u003Csummary>Full permissions table with roadmap context\u003C\u002Fsummary>\n\n| Roadmap area | Permission | Level | Notes |\n|---|---|---|---|\n| Auth | User `Email addresses` | Read-only | Resolves the user's email for Better Auth |\n| Core dashboard | Repository `Metadata` | Read-only | Baseline for repository-aware reads |\n| Pull requests | Repository `Pull requests` | Read & write | PR mutations, reviews, and management |\n| Issues | Repository `Issues` | Read & write | Label mutations and issue workflows |\n| CI status | Repository `Checks` | Read-only | PR status checks display |\n| GitHub Actions | Repository `Actions` | Read-only | Workflow run history and logs (upgrade to Read & write for rerun\u002Fcancel) |\n| Collaborators | Organization `Members` | Read-only | Reviewer pickers with team support |\n| Repo content | Repository `Contents` | Read & write | File browser, branch operations |\n| Workflow files | Repository `Workflows` | Read & write | Editing workflow definitions (future) |\n| Search | — | N\u002FA | Inherits from other permissions |\n| Notifications | — | N\u002FA | GitHub notifications API doesn't support App tokens; needs different strategy |\n\n\u003C\u002Fdetails>\n\n\u003Cdetails>\n\u003Csummary>Full webhook events table\u003C\u002Fsummary>\n\n| Event | Enable now | Why |\n|---|---|---|\n| Check run | Yes | PR status and check cache freshness |\n| Check suite | Yes | Suite-level CI state for PR refreshes |\n| Issue comment | Yes | Issue and PR comment views |\n| Issues | Yes | Issue metadata changes |\n| Pull request | Yes | Core PR invalidation |\n| Pull request review | Yes | Review state and PR detail |\n| Pull request review comment | Yes | Diff discussion and review comments |\n| Pull request review thread | Yes | Review thread state changes |\n| Status | Yes | Commit statuses (CodeRabbit, CircleCI, etc.) on PR pages |\n| Repository ruleset | Yes | Required status checks & \"Expected\" check rendering |\n| Branch protection rule | Yes | Required status checks (legacy protection) |\n| Workflow run | Yes | Workflow approval state + Actions dashboard |\n| Workflow job | Later | For Actions dashboard (job-level logs) |\n| Push | Later | Branch-aware activity features |\n| Repository | Later | Repo settings and metadata changes |\n| Create | Later | Branch\u002Ftag creation flows |\n| Delete | Later | Branch\u002Ftag deletion flows |\n\nEvents marked \"Later\" are harmless to enable now — the app will ignore them until handlers are added.\n\n\u003C\u002Fdetails>\n\n## Roadmap\n\n### Dashboard\n\n- [x] Overview with PR, issue, and review counts\n- [ ] Activity feed (recent events across repos)\n- [ ] Customizable dashboard widgets\n\n### Pull Requests\n\n- [x] List PRs by role (authored, assigned, review requested, mentioned, involved)\n- [x] PR detail view with metadata, body, and comments\n- [x] PR diff viewer with syntax highlighting\n- [x] Inline review comments on specific lines\n- [x] Submit reviews (approve, request changes, comment)\n- [x] Update branch with base\n- [ ] Create new pull requests\n- [x] Merge pull requests (merge, squash, rebase)\n- [x] Close \u002F reopen pull requests\n- [ ] Edit PR title, body, and metadata\n- [x] Add \u002F remove reviewers\n- [x] Add \u002F remove labels\n- [ ] Link issues to pull requests\n\n### Issues\n\n- [x] List issues by role (assigned, authored, mentioned)\n- [x] Issue detail view with metadata, body, and comments\n- [x] Create new issues\n- [ ] Close \u002F reopen issues\n- [x] Comment on issues\n- [ ] Edit issue title, body, and metadata\n- [x] Assign \u002F unassign users\n- [x] Add \u002F remove labels\n- [ ] Set milestones\n- [ ] Issue types (bug, feature, etc.)\n\n### Conversations\n\n- [ ] Auto-link issues and PRs by number (e.g. `#123`)\n- [ ] Link user mentions (e.g. `@username`)\n- [ ] Clickable and hoverable references (User names and icons, labels, commit SHAs, etc.)\n- [ ] \"Added a commit that referenced this issue\n- [ ] Projects\n- [ ] Linked pull requests and issues section in the sidebar\n\n### Code Reviews\n\n- [x] Pending review requests view\n- [x] File tree navigator with status badges\n- [x] Side-by-side diff view\n- [x] Multi-line comment selection\n- [ ] Resolve \u002F unresolve review threads\n- [ ] Suggest changes (code suggestions in comments)\n- [ ] Review comment reactions\n\n### Notifications\n\n- [ ] Notification inbox\n- [ ] Mark as read \u002F unread\n- [ ] Filter by type (PR, issue, review, CI)\n- [ ] Desktop notifications\n\n### Repositories\n\n- [x] Repository list and search\n- [x] Repository file browser\n- [ ] Branch and tag management\n- [x] README preview\n\n### Search\n\n- [x] Global search across PRs, issues, and repos\n- [ ] Saved searches and filters\n- [ ] Advanced query syntax\n\n### General\n\n- [x] GitHub App authentication\n- [x] Dark mode with system preference\n- [x] Response caching with ETags\n- [x] Keyboard shortcuts\n- [x] Command palette\n- [x] User settings and preferences\n- [x] Mobile-responsive layout\n\n## Contributing\n\nWe welcome contributions! Please read the [Contributing Guide](CONTRIBUTING.md) before submitting a pull request.\n\n## License\n\n[MIT](LICENSE)\n","DiffKit 是一个面向开发者的快速且注重设计的GitHub仪表板，旨在帮助用户高效管理拉取请求、问题和代码审查，同时减少无关信息干扰。其核心功能包括查看与管理跨仓库的拉取请求、跟踪带标签、里程碑及状态的问题、集中查看待处理的代码审查请求以及支持内联评论的PR差异查看器等。技术上，DiffKit采用了TanStack Start框架、Tailwind CSS 4进行样式设计，并通过Cloudflare Workers在边缘部署以实现高速响应。此外，还提供了全暗模式支持。此项目特别适合需要频繁参与或管理GitHub项目的开发者使用，在提高工作效率的同时保持界面简洁易用。",2,"2026-06-11 02:47:42","CREATED_QUERY"]