Read code as a graph, not as a wall of text.
Graphy is a desktop IDE that turns your codebase into a living graph of functions, modules and classes — connected by the relationships that actually matter (calls, imports, inheritance) instead of being scattered across files you have to scroll through.
Modern codebases are graphs pretending to be folders. A function calls another
function, which imports a module, which extends a class — yet IDEs still force
us to read them as a flat list of .ts files.
Graphy flips the model:
- Blocks instead of files. Every function, method, class and module is a node you can move, group and zoom into.
- Edges that mean something.
calls,imports,inherits— drawn between nodes so structure is visible at a glance. - AI built in. First-class integration with Claude and Codex to explain, refactor or generate code from inside the graph.
| Layer | Choice |
|---|---|
| Desktop shell | Electron 42 |
| Web framework | TanStack Start + React 19 |
| Styling | Tailwind CSS 4 |
| Icons | Tabler Icons |
| Static analysis | ts-morph (TypeScript compiler API) |
| AI providers | @anthropic-ai/sdk, @openai/codex-sdk |
| Bundler & dev | Vite 8 |
| Package manager | Bun |
| Tests | Vitest 4 |
- Bun
>= 1.0 - A recent Node-compatible toolchain (Electron 42 ships its own runtime)
bun installStarts the Vite dev server and Electron in one go:
bun run devbun run dist # current platform
bun run dist:linux # AppImage + .deb
bun run dist:mac # .dmg (x64 + arm64)Artifacts land in release/.
| Command | Description |
|---|---|
bun run dev |
Build the parser bundle (watch), start Vite, launch Electron. |
bun run dev:electron |
Start Electron pointing at the running web dev server. |
bun run dev:parser |
Watch and rebundle the parser CLI into dist-electron/parser.cjs. |
bun run build |
Build the parser bundle and the web app. |
bun run build:parser |
One-shot bundle of the parser CLI into dist-electron/parser.cjs. |
bun run start:desktop |
Build the app and launch Electron. |
bun run preview |
Preview the production build locally. |
bun run lint |
Run ESLint. |
bun run format |
Format with Prettier and auto-fix ESLint issues. |
bun run check |
Check formatting with Prettier. |
bun run dist |
Build and package the desktop app. |
Graphy/
├── electron/ Electron main + preload (CommonJS)
│ ├── main.cjs
│ └── preload.cjs
├── src/
│ ├── modules/
│ │ └── ai/ Unified AI interface (Claude + Codex)
│ ├── parser/ Code -> graph extraction (ts-morph)
│ │ ├── core/ GraphNode / GraphEdge models & schema
│ │ ├── functionExtractor.ts
│ │ └── projectLoader.ts
│ ├── routes/ TanStack Router file-based routes
│ ├── router.tsx
│ └── styles.css
├── tests/ Vitest fixtures and specs
└── public/ Static assets (icons, manifest)
- Load.
ProjectLoaderopens a target codebase throughts-morph, reading either atsconfig.json, a directory, or an explicit file list. - Extract.
functionExtractorwalks eachSourceFileand emitsGraphNodes — one per function, method, arrow, or class — with a stablefile::nameid. - Link. Edges (
calls,imports,inherits) are computed from the compiler's symbol table. - Render. The graph is handed to the TanStack Start UI and drawn inside the Electron window.
- Assist. The
aimodule exposes a singleAiServiceinterface (chat,stream,generateObject) backed by either Anthropic or Codex, so the UI doesn't care which provider is wired up.
- Core parser infrastructure (ts-morph)
- Function extraction
- Unified AI service interface (Claude + Codex)
- Electron packaging metadata
- Edge extraction (calls / imports / inherits)
- Interactive graph canvas
- AI-powered node inspector
- Multi-language support beyond TypeScript
This is a hackathon project — issues and PRs are welcome. Before opening a PR:
bun run format
bun run lint
bun run checkBuilt with care by SobshDev, Maty MILLIEN, Raphaël BERTAINA-LOICHEMOL and Nawfal HASSANI.
Private — all rights reserved (for now).