A lightweight, self-hosted Markdown notebook with a Japanese wabi-sabi aesthetic.
未書 — the beauty of what remains unwritten.
- Markdown Editor — Live preview with syntax highlighting (Highlight.js)
- Math Formulas — LaTeX rendering via KaTeX (
$inline$/$$block$$) - Sections & Tags — Organize notes with custom icons, colors, and tags
- Share Links — Generate public links for individual notes (single-page HTML, no login required)
- Print View — Serif typography (Noto Serif SC) optimized for printing
- Responsive — Full mobile support with slide-out sidebar
- File Storage — Notes stored as
.md+.meta.json, easy to backup and migrate
# Clone
git clone https://github.com/YOUR_USERNAME/misho-notes.git
cd misho-notes
# Install
pip install -r requirements.txt
# Run
python app.pyOpen http://localhost:1145, default password is changeme.
All via environment variables:
MISHO_PASSWORD=your_password # Login password (default: changeme)
MISHO_PORT=8080 # Port (default: 1145)
MISHO_DATA_DIR=/path/to/data # Data directory (default: ./data)misho-notes/
├── app.py # Flask backend
├── requirements.txt
├── .gitignore
├── static/
│ └── index.html # Single-file frontend (HTML + CSS + JS)
└── data/ # Created at runtime
├── sections.json
├── shares.json
└── {section_id}/
├── {note_id}.md
└── {note_id}.meta.json
- Backend — Flask, Python-Markdown
- Frontend — Vanilla JS (no framework), Marked.js, Highlight.js, KaTeX
- Fonts — Noto Serif SC, Noto Sans SC
- Design — Wabi-sabi aesthetic: parchment tones, ink accents, serif typography
pip install gunicorn
gunicorn -w 4 -b 0.0.0.0:1145 app:appserver {
listen 80;
server_name notes.example.com;
location / {
proxy_pass http://127.0.0.1:1145;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}MIT