Skip to content

Commit ebe3e2a

Browse files
Initial release: Ironpad v0.1.0 - Local-first, file-based project and knowledge management system. Rust backend, Vue 3 frontend, Milkdown editor, Git integration, cross-platform builds. Built with AI using Open Method.
Co-authored-by: Cursor <cursoragent@cursor.com>
0 parents  commit ebe3e2a

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

97 files changed

+25033
-0
lines changed

.github/workflows/ci.yml

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
name: CI
2+
3+
on:
4+
push:
5+
branches: [main]
6+
pull_request:
7+
branches: [main]
8+
9+
jobs:
10+
backend:
11+
name: Backend (Rust)
12+
runs-on: ubuntu-latest
13+
steps:
14+
- uses: actions/checkout@v4
15+
16+
- name: Install Rust toolchain
17+
uses: dtolnay/rust-toolchain@stable
18+
19+
- name: Cache cargo
20+
uses: actions/cache@v4
21+
with:
22+
path: |
23+
~/.cargo/bin/
24+
~/.cargo/registry/index/
25+
~/.cargo/registry/cache/
26+
~/.cargo/git/db/
27+
backend/target/
28+
key: ${{ runner.os }}-cargo-${{ hashFiles('backend/Cargo.lock') }}
29+
30+
- name: Check
31+
working-directory: backend
32+
run: cargo check
33+
34+
- name: Test
35+
working-directory: backend
36+
run: cargo test
37+
38+
- name: Format check
39+
working-directory: backend
40+
run: cargo fmt -- --check
41+
42+
frontend:
43+
name: Frontend (Vue)
44+
runs-on: ubuntu-latest
45+
steps:
46+
- uses: actions/checkout@v4
47+
48+
- name: Install Node.js
49+
uses: actions/setup-node@v4
50+
with:
51+
node-version: 20
52+
cache: npm
53+
cache-dependency-path: frontend/package-lock.json
54+
55+
- name: Install dependencies
56+
working-directory: frontend
57+
run: npm ci
58+
59+
- name: Type check
60+
working-directory: frontend
61+
run: npx vue-tsc --noEmit
62+
63+
- name: Build
64+
working-directory: frontend
65+
run: npm run build

.github/workflows/release.yml

Lines changed: 105 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,105 @@
1+
name: Release
2+
3+
on:
4+
push:
5+
tags:
6+
- 'v*'
7+
8+
permissions:
9+
contents: write
10+
11+
jobs:
12+
build:
13+
name: Build ${{ matrix.target }}
14+
runs-on: ${{ matrix.os }}
15+
strategy:
16+
fail-fast: false
17+
matrix:
18+
include:
19+
- target: x86_64-unknown-linux-gnu
20+
os: ubuntu-latest
21+
archive: tar.gz
22+
- target: x86_64-apple-darwin
23+
os: macos-latest
24+
archive: tar.gz
25+
- target: x86_64-pc-windows-msvc
26+
os: windows-latest
27+
archive: zip
28+
29+
steps:
30+
- name: Checkout
31+
uses: actions/checkout@v4
32+
33+
- name: Install Rust toolchain
34+
uses: dtolnay/rust-toolchain@stable
35+
with:
36+
targets: ${{ matrix.target }}
37+
38+
- name: Install Node.js
39+
uses: actions/setup-node@v4
40+
with:
41+
node-version: 20
42+
43+
- name: Build frontend
44+
working-directory: frontend
45+
run: |
46+
npm ci
47+
npm run build
48+
49+
- name: Copy frontend to static
50+
shell: bash
51+
run: |
52+
mkdir -p backend/static
53+
cp -r frontend/dist/* backend/static/
54+
55+
- name: Build backend (release)
56+
working-directory: backend
57+
run: cargo build --release --target ${{ matrix.target }}
58+
59+
- name: Package (Unix)
60+
if: matrix.archive == 'tar.gz'
61+
shell: bash
62+
run: |
63+
BINARY_NAME="ironpad"
64+
RELEASE_DIR="ironpad-${{ github.ref_name }}-${{ matrix.target }}"
65+
mkdir -p "$RELEASE_DIR"
66+
cp "backend/target/${{ matrix.target }}/release/$BINARY_NAME" "$RELEASE_DIR/"
67+
cp README.md LICENSE "$RELEASE_DIR/"
68+
tar czf "$RELEASE_DIR.tar.gz" "$RELEASE_DIR"
69+
echo "ASSET=$RELEASE_DIR.tar.gz" >> $GITHUB_ENV
70+
71+
- name: Package (Windows)
72+
if: matrix.archive == 'zip'
73+
shell: bash
74+
run: |
75+
BINARY_NAME="ironpad.exe"
76+
RELEASE_DIR="ironpad-${{ github.ref_name }}-${{ matrix.target }}"
77+
mkdir -p "$RELEASE_DIR"
78+
cp "backend/target/${{ matrix.target }}/release/$BINARY_NAME" "$RELEASE_DIR/"
79+
cp README.md LICENSE "$RELEASE_DIR/"
80+
7z a "$RELEASE_DIR.zip" "$RELEASE_DIR"
81+
echo "ASSET=$RELEASE_DIR.zip" >> $GITHUB_ENV
82+
83+
- name: Upload artifact
84+
uses: actions/upload-artifact@v4
85+
with:
86+
name: ironpad-${{ matrix.target }}
87+
path: ${{ env.ASSET }}
88+
89+
release:
90+
name: Create Release
91+
needs: build
92+
runs-on: ubuntu-latest
93+
steps:
94+
- name: Download all artifacts
95+
uses: actions/download-artifact@v4
96+
with:
97+
path: artifacts
98+
99+
- name: Create GitHub Release
100+
uses: softprops/action-gh-release@v2
101+
with:
102+
files: artifacts/**/*
103+
generate_release_notes: true
104+
env:
105+
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

.gitignore

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
# === OS ===
2+
.DS_Store
3+
Thumbs.db
4+
Desktop.ini
5+
6+
# === Editors / IDEs ===
7+
.idea/
8+
.vscode/
9+
*.swp
10+
*.swo
11+
*~
12+
13+
# === Rust ===
14+
backend/target/
15+
16+
# === Node.js ===
17+
frontend/node_modules/
18+
frontend/dist/
19+
frontend/.vite/
20+
21+
# === Build artifacts ===
22+
backend/static/
23+
*.tmp
24+
25+
# === User data (created at runtime) ===
26+
# The data/ directory is the user's local database.
27+
# We include only the skeleton structure (.gitkeep files),
28+
# not the actual notes, projects, tasks, or daily notes.
29+
data/.git/
30+
data/.gitignore
31+
data/inbox.md
32+
data/index.md
33+
data/archive/*.md
34+
data/daily/*.md
35+
data/notes/*.md
36+
data/notes/assets/*
37+
!data/notes/assets/.gitkeep
38+
data/projects/*/
39+
!data/projects/.gitkeep
40+
41+
# === Stray root lock file (frontend/package-lock.json is kept for CI) ===
42+
/package-lock.json
43+
44+
# === Generated images (article assets, not source) ===
45+
/assets/

LICENSE

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
MIT License
2+
3+
Copyright (c) 2026 Ola Proeis
4+
5+
Permission is hereby granted, free of charge, to any person obtaining a copy
6+
of this software and associated documentation files (the "Software"), to deal
7+
in the Software without restriction, including without limitation the rights
8+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9+
copies of the Software, and to permit persons to whom the Software is
10+
furnished to do so, subject to the following conditions:
11+
12+
The above copyright notice and this permission notice shall be included in all
13+
copies or substantial portions of the Software.
14+
15+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21+
SOFTWARE.

README.md

Lines changed: 142 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,142 @@
1+
# Ironpad
2+
3+
**A local-first, file-based project & knowledge management system.**
4+
5+
![Build](https://github.com/OlaProeis/ironPad/actions/workflows/release.yml/badge.svg)
6+
![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)
7+
![Platform](https://img.shields.io/badge/platform-Windows%20%7C%20macOS%20%7C%20Linux-lightgrey)
8+
![Rust](https://img.shields.io/badge/rust-1.70%2B-orange)
9+
![Version](https://img.shields.io/badge/version-0.1.0-green)
10+
11+
Ironpad stores all your notes, projects, and tasks as plain Markdown files. No cloud services, no vendor lock-in -- your data stays on your machine in a format you can read and edit with any text editor. Every change is automatically versioned with Git.
12+
13+
![Ironpad Screenshot](docs/screenshot.jpg)
14+
15+
> **v0.1.0 -- Early Release.** This is the first public release. It's functional and we use it daily, but expect rough edges. Bug reports and feature requests are welcome via [Issues](https://github.com/OlaProeis/ironPad/issues).
16+
17+
---
18+
19+
## Features
20+
21+
- **File-based storage** -- All data stored as Markdown files with YAML frontmatter
22+
- **Local-first** -- Works fully offline, no internet required
23+
- **Git integration** -- Automatic version control with 60-second commit batching, full diff viewer, push/fetch
24+
- **WYSIWYG editing** -- Milkdown editor with real-time markdown rendering and formatting toolbar
25+
- **Project management** -- Organize tasks and notes by project with due dates, tags, subtasks, and recurrence
26+
- **Calendar view** -- Month grid showing tasks by due date with color-coded urgency
27+
- **Dashboard** -- Cross-project overview with active task summaries
28+
- **Daily notes** -- Quick capture with templates for daily journaling
29+
- **Real-time sync** -- WebSocket-based live updates; edit in VS Code, see changes in the browser instantly
30+
- **External editing** -- Full support for VS Code, Obsidian, Vim, or any text editor
31+
- **Search** -- ripgrep-powered full-text search across all files (Ctrl+K)
32+
- **Dark theme** -- Beautiful dark UI by default with light mode toggle
33+
- **Tiny footprint** -- 5 MB binary, ~20 MB RAM, sub-second startup
34+
35+
## Quick Start
36+
37+
### Option 1: Download Release (Recommended)
38+
39+
1. Download the latest release for your platform from [Releases](https://github.com/OlaProeis/ironPad/releases)
40+
2. Extract and run the executable
41+
3. Your browser opens automatically -- start using Ironpad
42+
43+
Data is stored in a `data/` folder next to the executable. To use a custom location, set the `IRONPAD_DATA_DIR` environment variable.
44+
45+
### Option 2: Build From Source
46+
47+
**Prerequisites:** [Rust](https://rustup.rs/) (1.70+), [Node.js](https://nodejs.org/) (18+), [Git](https://git-scm.com/)
48+
49+
```bash
50+
# Clone the repository
51+
git clone https://github.com/OlaProeis/ironPad.git
52+
cd ironPad
53+
54+
# Start the backend
55+
cd backend
56+
cargo run
57+
58+
# In a new terminal, start the frontend
59+
cd frontend
60+
npm install
61+
npm run dev
62+
```
63+
64+
Open http://localhost:5173 in your browser.
65+
66+
## Tech Stack
67+
68+
| Component | Technology |
69+
|-----------|------------|
70+
| Backend | Rust, Axum 0.8, Tokio |
71+
| Frontend | Vue 3, Vite, TypeScript |
72+
| Editor | Milkdown (ProseMirror-based) |
73+
| State | Pinia |
74+
| Routing | Vue Router |
75+
| Data | Markdown + YAML frontmatter |
76+
| Version Control | Git (via git2) |
77+
| Search | ripgrep |
78+
79+
## Roadmap
80+
81+
Ironpad is under active development. Here's what's planned:
82+
83+
- [ ] UI polish and animations
84+
- [ ] Tag extraction and filtering across projects
85+
- [ ] Backlinks between notes
86+
- [ ] Graph view of note connections
87+
- [ ] Export to PDF / HTML
88+
- [ ] Custom themes
89+
- [ ] Global hotkey (Ctrl+Shift+Space)
90+
- [ ] System tray mode
91+
- [ ] Kanban board view for tasks
92+
93+
See [CHECKLIST.md](docs/ai-workflow/CHECKLIST.md) for detailed implementation status.
94+
95+
## Built With AI
96+
97+
This entire application was built using AI-assisted development -- an approach we call **Open Method**. We share not just the code, but the complete process: the PRD, task breakdowns, handover documents, and workflow artifacts.
98+
99+
Read about the method:
100+
- [The AI Development Workflow I Actually Use](https://dev.to/olaproeis/the-ai-development-workflow-i-actually-use-549i) -- The original workflow article
101+
- [docs/ai-workflow/](docs/ai-workflow/) -- Documentation of the AI-assisted development process used to build Ironpad
102+
103+
**Tools used:** Cursor IDE, Claude Opus 4.5/4.6, Context7 MCP
104+
105+
## Configuration
106+
107+
| Setting | Default | Description |
108+
|---------|---------|-------------|
109+
| Data directory | `data/` next to executable | Override with `IRONPAD_DATA_DIR` env var |
110+
| Backend port | 3000 (auto-increments to 3010) | Dynamic port selection |
111+
| Auto-commit | Every 60 seconds | Git commits when changes exist |
112+
| Auto-save | 1 second debounce | Frontend saves after typing stops |
113+
114+
## Documentation
115+
116+
| Document | Description |
117+
|----------|-------------|
118+
| [docs/API.md](docs/API.md) | Complete REST API reference |
119+
| [docs/ARCHITECTURE.md](docs/ARCHITECTURE.md) | System design and technical details |
120+
| [docs/ai-workflow/](docs/ai-workflow/) | AI development workflow and methodology |
121+
122+
## Contributing
123+
124+
This is an early release and contributions are welcome!
125+
126+
1. Check [Issues](https://github.com/OlaProeis/ironPad/issues) for open bugs and feature requests
127+
2. Create a branch for your feature/fix
128+
3. Follow the code style (`cargo fmt` for Rust)
129+
4. Test your changes thoroughly
130+
5. Submit a pull request
131+
132+
## License
133+
134+
[MIT License](LICENSE)
135+
136+
## Acknowledgments
137+
138+
- [Milkdown](https://milkdown.dev/) -- WYSIWYG Markdown editor
139+
- [Axum](https://github.com/tokio-rs/axum) -- Rust web framework
140+
- [Vue.js](https://vuejs.org/) -- Frontend framework
141+
- [Pinia](https://pinia.vuejs.org/) -- State management
142+
- [Anthropic Claude](https://www.anthropic.com/) -- AI-assisted development

0 commit comments

Comments
 (0)