{"id":50942152,"url":"https://github.com/fabiofiorita/porcelain","last_synced_at":"2026-06-17T16:01:47.985Z","repository":{"id":364607114,"uuid":"1268545298","full_name":"FabioFiorita/porcelain","owner":"FabioFiorita","description":"Review changes as a story — a lightweight macOS code viewer and companion for the age of coding agents.","archived":false,"fork":false,"pushed_at":"2026-06-13T18:46:21.000Z","size":4398,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-06-13T19:12:12.301Z","etag":null,"topics":["code-review","developer-tools","diff-viewer","electron","git","macos","react","typescript"],"latest_commit_sha":null,"homepage":null,"language":"TypeScript","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/FabioFiorita.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","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":"AGENTS.md","dco":null,"cla":null}},"created_at":"2026-06-13T16:57:06.000Z","updated_at":"2026-06-13T18:46:24.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/FabioFiorita/porcelain","commit_stats":null,"previous_names":["fabiofiorita/porcelain"],"tags_count":3,"template":false,"template_full_name":null,"purl":"pkg:github/FabioFiorita/porcelain","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/FabioFiorita%2Fporcelain","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/FabioFiorita%2Fporcelain/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/FabioFiorita%2Fporcelain/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/FabioFiorita%2Fporcelain/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/FabioFiorita","download_url":"https://codeload.github.com/FabioFiorita/porcelain/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/FabioFiorita%2Fporcelain/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34453446,"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-06-17T02:00:05.408Z","response_time":127,"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":["code-review","developer-tools","diff-viewer","electron","git","macos","react","typescript"],"created_at":"2026-06-17T16:00:58.410Z","updated_at":"2026-06-17T16:01:47.979Z","avatar_url":"https://github.com/FabioFiorita.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cdiv align=\"center\"\u003e\n  \u003cimg src=\"src/renderer/src/assets/logo.png\" alt=\"Porcelain\" width=\"120\" /\u003e\n  \u003ch1\u003ePorcelain\u003c/h1\u003e\n  \u003cp\u003e\u003cstrong\u003eReview changes as a story.\u003c/strong\u003e\u003c/p\u003e\n  \u003cp\u003eA lightweight macOS code viewer and companion for the age of coding agents.\u003c/p\u003e\n\u003c/div\u003e\n\n---\n\nYou drive your coding agents from the terminal. But the moment you need to *read* the result — skim a diff, trace a change across files, understand what the agent actually did — you reach for Cursor, Zed, or GitHub Desktop. Heavy editors for a job that isn't editing.\n\nPorcelain fills that gap. It's a fast, focused **viewer** — not an editor, not a terminal — built to read code and review changes alongside your agent and your real terminal (Ghostty, Warp, whatever you like).\n\n## Why Porcelain\n\n- **Flow-ordered review.** A diff isn't an alphabetical list of files — it's one change rippling through your stack. Porcelain orders and groups changed files along their dependency flow (component → query → route → controller → service → schema), so you read a feature as a story from entry point to database instead of jumping around a file tree.\n- **Built for huge monorepos.** Stays fast on a ~50 GB repo. Folders can be hidden so only the apps you care about are visible, and pinned for quick access — nothing is indexed until you look at it. No other tool lets you carve a monorepo down to just the part you're working on.\n- **A terminal *companion*, not a terminal.** Porcelain has no embedded terminal on purpose — it can't beat Ghostty or Warp and won't try. The git actions it does offer (quick commands, commits) run in-app with output shown inline.\n- **Viewer first, lightweight always.** Fast file viewing with Shiki syntax highlighting, no LSP and no extensions. Quick single-file edits are allowed (pencil → edit → save) — but no autocomplete, no format-on-save, no multi-file refactors. It never grows into an IDE.\n\n## Features\n\n- **Flow-ordered diff review** with per-repo layer definitions you can customize\n- **Git** — working-tree diffs (unified or split), commit history, worktree switching, in-app commits with conventional-commit chips learned from your history\n- **Fast file viewer** — virtualized rendering, Shiki highlighting, image and Markdown support (reader + source modes)\n- **Monorepo navigation** — hide/unhide folders, pin paths, lazy per-directory loading\n- **Cmd+P fuzzy file finder**, Cmd+F find-in-file, find-references via `git grep`\n- **Liquid-glass UI** — native macOS vibrancy, floating sidebars, drag-resizable panels\n- **Auto-updating** signed builds\n\n## Install\n\n\u003e Requires macOS (Apple Silicon).\n\nDownload the latest `.dmg` from the [Releases](https://github.com/fabiofiorita/porcelain/releases) page, open it, and drag Porcelain to your Applications folder. The app checks for and installs updates automatically.\n\n## Develop\n\nPorcelain is built with Electron (electron-vite), React 19, TypeScript (strict), shadcn/ui on Base UI, Tailwind v4, tRPC over IPC, TanStack Query, and zustand. State and git access run through a single, deliberately uniform architecture — see [CLAUDE.md](CLAUDE.md) and the skills in [`.agents/skills/`](.agents/skills/).\n\n```bash\npnpm install   # install dependencies\npnpm dev       # run the app in development\n```\n\n`pnpm dev` runs against a throwaway playground repo and an isolated config, so it never touches your real repositories.\n\n### Common scripts\n\n| Command | What it does |\n|---|---|\n| `pnpm dev` | Run the app in development |\n| `pnpm lint` | Biome lint + format check |\n| `pnpm typecheck` | Type-check main and renderer |\n| `pnpm test` | Run the Vitest suite |\n| `pnpm build` | Type-check and build |\n| `pnpm dist` | Build a signed local `.dmg` / `.zip` |\n| `pnpm release` | Build and publish to GitHub Releases |\n\nThe verification gate before any commit is `pnpm lint \u0026\u0026 pnpm typecheck \u0026\u0026 pnpm test \u0026\u0026 pnpm build`.\n\n## License\n\n[MIT](LICENSE) © Fabio Fiorita\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffabiofiorita%2Fporcelain","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ffabiofiorita%2Fporcelain","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffabiofiorita%2Fporcelain/lists"}