Getting Started
New contributor guide for the Inklings codebase.
Prerequisites
Section titled “Prerequisites”Install all required tools before cloning.
Required Tools
Section titled “Required Tools”Node.js >=22.0.0
node --version # must be v22+Install via nvm or nodejs.org.
pnpm >=10.0.0
pnpm --version # must be v10+npm install -g pnpm@10.30.1Rust (latest stable)
rustc --versionInstall via rustup.rs, then add required components:
rustup component add clippy rustfmtgitleaks — required by pre-commit hook
gitleaks versionbrew install gitleaks # macOSdprint — Markdown formatter (table alignment, line wrapping)
dprint --versionbrew install dprint # macOSuv — Python package manager (required for apps/python-sidecar/)
uv --versionbrew install uv # macOS (or https://docs.astral.sh/uv/)Platform Dependencies
Section titled “Platform Dependencies”macOS
xcode-select --installLinux (Debian/Ubuntu)
sudo apt-get install -y libwebkit2gtk-4.1-dev \ libappindicator3-dev librsvg2-dev patchelf libssl-dev libgtk-3-dev1. Clone and install
Section titled “1. Clone and install”git clone https://github.com/MasterCodeYoda/inklings.gitcd inklingspnpm install2. Generate types
Section titled “2. Generate types”pnpm generate:typesThis runs Specta to generate TypeScript types from Rust structs into packages/contracts/generated/. Run this before
dev, build, or typecheck — without it, TypeScript will not find the generated types.
3. Set up the Python sidecar (optional)
Section titled “3. Set up the Python sidecar (optional)”If you work on the agent harness or skill system, install the sidecar’s Python dependencies:
cd apps/python-sidecaruv sync --group devcd ../..This is only needed for sidecar development and testing. The desktop app uses a pre-built binary in production.
4. Start the app
Section titled “4. Start the app”pnpm desktop:devThis starts Vite (React frontend) and Tauri (Rust backend) together. On first run, Cargo compiles all Rust crates — expect a few minutes.
5. Verify
Section titled “5. Verify”cargo test # Rust unit + integration testspnpm test # All tests via Turbo (includes frontend)All tests should pass before you start making changes.
6. Local Agent Testing (Optional)
Section titled “6. Local Agent Testing (Optional)”If you work on the LLM or agent subsystems, you can run the LLM integration tests against a local Ollama installation:
# macOSbrew install ollamaollama pull qwen3:4b # default model for integration testsollama serve # starts the server on localhost:11434Then run the ignored tests:
cargo test -p core-tests --test llm_integration -- --ignoredTests that cannot reach Ollama skip automatically — they never fail a clean CI run.
Development Environment
Section titled “Development Environment”The app uses environment-aware paths so dev data never touches your real Inklings data:
| Environment | Workspaces | Settings |
|---|---|---|
| Dev | {project}/.data/workspaces/ | {project}/.data/settings.json |
| Production | ~/Inklings/Workspaces/ | ~/Library/Application Support/Inklings/settings.json |
Dev mode activates automatically for debug builds (pnpm desktop:dev). Release builds (pnpm desktop:build) use
production paths.
To reset all dev app data:
./tools/dev/reset-app-data.sh # interactive./tools/dev/reset-app-data.sh --force # skip confirmationKey Commands
Section titled “Key Commands”# Developmentpnpm dev # All packages via Turbopnpm desktop:dev # Desktop app only (Vite + Tauri)
# Buildpnpm build # All packagespnpm desktop:build # Desktop app only
# Types (run after modifying Rust structs)pnpm generate:types
# Lintingpnpm lint # oxlint (TypeScript)pnpm typecheck # TypeScript type checkingcargo clippy # Rust lintingcargo fmt # Rust formatting
# Testingpnpm test # All testscargo test # Rust onlycargo test -p core-tests # Real SQLite integration testsProject Orientation
Section titled “Project Orientation”Architecture
Section titled “Architecture”Polyglot modular monolith following Clean Architecture. Dependencies flow inward — enforced at compile time via separate crates:
Framework (src-tauri) → Infrastructure (sqlite, import) → Application (use cases + service traits) → Domain (pure entities)See CONTRIBUTING.md for the full directory layout and development workflow.
Key directories
Section titled “Key directories”| Path | What lives there |
|---|---|
crates/domain/ | Pure business entities (no external deps) |
crates/application/ | Use cases + repository traits |
crates/infrastructure/sqlite/ | SQLite storage implementations |
apps/desktop/src-react/ | React frontend (TypeScript) |
apps/desktop/src-tauri/ | Tauri commands + app wiring |
packages/contracts/generated/ | Auto-generated Rust->TS types (do not edit) |
tests/core/ | Real use cases wired to real SQLite |
apps/desktop/tests/ | Playwright tests with mocked backend |
Environment variables
Section titled “Environment variables”If you plan to work on cloud features (auth, sync, analytics), copy the environment template:
cp .env.example .envEdit .env with your Supabase credentials.
Further reading
Section titled “Further reading”- CONTRIBUTING.md — full architecture overview, build reference, and development workflow
docs/guides/development-guide.md— vertical slicing methodology, commit discipline, testing strategy- Domain Rules — business invariants enforced in Rust
- Systems documentation — per-system deep dives (pages, event log, import, etc.)
Embedding Model
Section titled “Embedding Model”On first workspace open, the app auto-downloads the embedding model (~585 MB) from HuggingFace. Download progress is
streamed via Tauri events (embedding-model:download-progress). The model is SHA-256 verified before use. Semantic
search is enabled by default (semantic_search_enabled setting). A dev script is also available for pre-downloading in
CI or local dev:
./tools/dev/download-embedding-model.shCommon Issues
Section titled “Common Issues”Linter issues (oxlint)
Section titled “Linter issues (oxlint)”The project uses oxlint for TypeScript linting. Run pnpm lint from the repo root to check for violations.
Clippy idiom errors
Section titled “Clippy idiom errors”See docs/solutions/build-errors/rust-clippy-idioms-catalog.md for common patterns and fixes.
”Database version is newer than app version”
Section titled “”Database version is newer than app version””The workspace was created by a newer build. Update your local build or reset dev data:
./tools/dev/reset-app-data.sh --forceWas this page helpful?
Thanks for your feedback!