Thanks for your interest in contributing to Liminal Notes 💚
This document is a quick guide for humans and code agents (AI tools) on how to work in this repo. For more detailed norms and project context, see AGENTS.md and the files in the docs/ directory.
Liminal Notes is a local-first, Markdown-based note-taking app with:
- Plain
.mdfiles in a vault folder. [[wikilinks]]and backlinks between notes.- A cross-platform desktop app built with Tauri (Rust + TypeScript/React).
- A planned plugin system and optional local AI assistants (using the
@huggingface/transformersJavaScript library).
Early milestones focus on:
- Single vault.
- File tree sidebar.
- Markdown editing + preview.
- Wikilinks + backlinks.
- Simple search.
Future work adds plugins, AI assistant, and semantic links.
For a deeper overview, see:
docs/SPEC.mddocs/ARCHITECTURE.mddocs/MVP_APP.mddocs/BUILD_PLAN.md
-
Frontend: TypeScript + React.
- Use strict TypeScript; avoid
anyunless there is a clear reason.
- Use strict TypeScript; avoid
-
Backend: Rust (Tauri backend).
- Encapsulate filesystem access, vault management, and Tauri commands in focused modules.
We use Conventional Commits. Examples:
feat: add vault picker dialogfix: handle empty vault config gracefullyrefactor: extract note loading hookchore: bump tauri and typescriptdocs: describe plugin permissions
Commit subjects should be:
- Imperative ("add X", "fix Y").
- Clear and atomic (one logical change per commit).
For more detail, see AGENTS.md → Commit Guidelines.
Documentation, comments, and commit messages should follow Canadian English spelling where natural:
- colour, centre, licence (noun), organise, behaviour, favour, etc.
Code identifiers still follow platform conventions (color in CSS, etc.).
See AGENTS.md → Canadian English Spelling.
You’ll likely need:
- Node.js (LTS)
pnpm- Rust toolchain (for Tauri)
- Tauri system dependencies (platform-specific)
Follow Tauri’s docs for platform setup if needed.
From the repo root:
pnpm install
pnpm tauri dev(If the Tauri app has not been scaffolded yet, see docs/BUILD_PLAN.md for the expected structure and tasks.)
If you use VS Code and Docker, you can open the repo in VS Code and use "Reopen in Container" to get a preconfigured environment with Node.js, pnpm, Rust, and Tauri dependencies. See .devcontainer/devcontainer.json for details.
Once the container is running, you can use the standard commands (e.g., pnpm tauri dev) from the integrated terminal.
If you’re implementing core app features:
-
Read the relevant sections of:
docs/MVP_APP.mddocs/ARCHITECTURE.mddocs/SPEC.md
-
Check
docs/BUILD_PLAN.mdto see which milestone your work belongs to. -
Open a branch named after the feature, e.g.:
feat/vault-pickerfeat/wikilinks-backlinksfeat/search-modal
If you’re working on plugins or AI features:
-
Start with:
docs/PLUGIN_API.mddocs/plugins/LOCAL_AI_ASSISTANT_PLUGIN.mddocs/plugins/SEMANTIC_LINKS_PLUGIN.md
-
Create a feature branch.
-
Make small, focused commits.
-
Run the app regularly (
pnpm tauri dev). -
Keep docs aligned with behaviour:
- If you change how something works, update the relevant doc in
docs/in the same PR.
- If you change how something works, update the relevant doc in
-
Open a PR with:
- A short description of the change.
- Any notable trade-offs or follow-up tasks.
Testing and linting will evolve, but the general expectations are:
pnpm lint– static checks for frontend code (once configured).pnpm test– frontend tests (once configured).cargo test– Rust unit tests (as backend logic grows).
Please run whatever checks exist before opening a PR.
The docs/ directory is the backbone of the project:
-
Specs & architecture
docs/SPEC.mddocs/ARCHITECTURE.mddocs/MVP_APP.mddocs/BUILD_PLAN.md
-
Extensibility
docs/PLUGIN_API.mddocs/plugins/LOCAL_AI_ASSISTANT_PLUGIN.mddocs/plugins/SEMANTIC_LINKS_PLUGIN.md
When you change behaviour, it’s better to adjust the spec than let docs drift.
AGENTS.md gives extra detail on which docs to update for which kind of change.
AI tools (like automated coding agents) are welcome, but:
-
They should follow
AGENTS.mdand thisCONTRIBUTING.md. -
Generated code should be:
- Readable and idiomatic.
- Strict TypeScript- and Rust-compatible.
-
Please review AI-generated changes as if they came from a junior contributor:
- Check types, error handling, comments, and alignment with the spec.
If you’re opening an issue or proposing a feature:
-
Describe the problem first, not just the solution.
-
Reference relevant docs where possible (e.g., section in
MVP_APP.mdorSPEC.md). -
If it’s a larger feature, outline:
- What milestone/phase it might belong to.
- Any interactions with plugins or AI.
Thanks again for helping build Liminal Notes. The goal is a notes system that feels like it’s working with you — contributors included. 🍁