markora 1.0.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- markora-1.0.0/LICENSE +21 -0
- markora-1.0.0/PKG-INFO +294 -0
- markora-1.0.0/README.md +247 -0
- markora-1.0.0/pyproject.toml +88 -0
- markora-1.0.0/setup.cfg +4 -0
- markora-1.0.0/setup.py +17 -0
- markora-1.0.0/src/markora/__init__.py +28 -0
- markora-1.0.0/src/markora/cli.py +591 -0
- markora-1.0.0/src/markora/config.py +82 -0
- markora-1.0.0/src/markora/document.py +234 -0
- markora-1.0.0/src/markora/favorites.py +67 -0
- markora-1.0.0/src/markora/keep.py +513 -0
- markora-1.0.0/src/markora/quicknote.py +33 -0
- markora-1.0.0/src/markora/tui.py +1327 -0
- markora-1.0.0/src/markora.egg-info/PKG-INFO +294 -0
- markora-1.0.0/src/markora.egg-info/SOURCES.txt +22 -0
- markora-1.0.0/src/markora.egg-info/dependency_links.txt +1 -0
- markora-1.0.0/src/markora.egg-info/entry_points.txt +5 -0
- markora-1.0.0/src/markora.egg-info/requires.txt +17 -0
- markora-1.0.0/src/markora.egg-info/top_level.txt +1 -0
- markora-1.0.0/tests/test_cli.py +26 -0
- markora-1.0.0/tests/test_document.py +65 -0
- markora-1.0.0/tests/test_favorites.py +33 -0
- markora-1.0.0/tests/test_quicknote.py +19 -0
markora-1.0.0/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 zyekhabdul <zyekhabdulqadirjailani@gmail.com>
|
|
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.
|
markora-1.0.0/PKG-INFO
ADDED
|
@@ -0,0 +1,294 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: markora
|
|
3
|
+
Version: 1.0.0
|
|
4
|
+
Summary: ⚡ Sovereign Markor-style Markdown Notebook, QuickNotes & Todo TUI for Terminal Power Users
|
|
5
|
+
Author-email: zyekhabdul <zyekhabdulqadirjailani@gmail.com>
|
|
6
|
+
License: MIT
|
|
7
|
+
Project-URL: Homepage, https://github.com/zyekhabdul/markora
|
|
8
|
+
Project-URL: Repository, https://github.com/zyekhabdul/markora.git
|
|
9
|
+
Project-URL: Issues, https://github.com/zyekhabdul/markora/issues
|
|
10
|
+
Project-URL: Changelog, https://github.com/zyekhabdul/markora/blob/main/CHANGELOG.md
|
|
11
|
+
Keywords: markora,markor,markdown,notes,notebook,todo,tui,curses,google-keep,productivity,cli,terminal
|
|
12
|
+
Classifier: Development Status :: 5 - Production/Stable
|
|
13
|
+
Classifier: Environment :: Console
|
|
14
|
+
Classifier: Environment :: Console :: Curses
|
|
15
|
+
Classifier: Intended Audience :: Developers
|
|
16
|
+
Classifier: Intended Audience :: End Users/Desktop
|
|
17
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
18
|
+
Classifier: Operating System :: POSIX :: Linux
|
|
19
|
+
Classifier: Operating System :: MacOS
|
|
20
|
+
Classifier: Programming Language :: Python :: 3
|
|
21
|
+
Classifier: Programming Language :: Python :: 3.8
|
|
22
|
+
Classifier: Programming Language :: Python :: 3.9
|
|
23
|
+
Classifier: Programming Language :: Python :: 3.10
|
|
24
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
25
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
26
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
27
|
+
Classifier: Programming Language :: Python :: 3.14
|
|
28
|
+
Classifier: Topic :: Text Editors
|
|
29
|
+
Classifier: Topic :: Utilities
|
|
30
|
+
Requires-Python: >=3.8
|
|
31
|
+
Description-Content-Type: text/markdown
|
|
32
|
+
License-File: LICENSE
|
|
33
|
+
Provides-Extra: keep
|
|
34
|
+
Requires-Dist: gkeepapi>=0.14.0; extra == "keep"
|
|
35
|
+
Requires-Dist: gpsoauth>=1.0.0; extra == "keep"
|
|
36
|
+
Provides-Extra: browser-auth
|
|
37
|
+
Requires-Dist: playwright>=1.40.0; extra == "browser-auth"
|
|
38
|
+
Provides-Extra: all
|
|
39
|
+
Requires-Dist: gkeepapi>=0.14.0; extra == "all"
|
|
40
|
+
Requires-Dist: gpsoauth>=1.0.0; extra == "all"
|
|
41
|
+
Requires-Dist: playwright>=1.40.0; extra == "all"
|
|
42
|
+
Provides-Extra: dev
|
|
43
|
+
Requires-Dist: pytest>=7.0.0; extra == "dev"
|
|
44
|
+
Requires-Dist: pytest-cov>=4.0.0; extra == "dev"
|
|
45
|
+
Requires-Dist: flake8>=6.0.0; extra == "dev"
|
|
46
|
+
Dynamic: license-file
|
|
47
|
+
|
|
48
|
+
<div align="center">
|
|
49
|
+
|
|
50
|
+
```
|
|
51
|
+
__ __ _
|
|
52
|
+
| \/ | | |
|
|
53
|
+
| \ / | __ _ _ __| | _____ _ __ __ _
|
|
54
|
+
| |\/| |/ _` | '__| |/ / _ \| '__/ _` |
|
|
55
|
+
| | | | (_| | | | < (_) | | | (_| |
|
|
56
|
+
|_| |_|\__,_|_| |_|\_\___/|_| \__,_|
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
### ⚡ Sovereign Markor-style Markdown Notebook, QuickNotes & Todo TUI for Terminal Power Users
|
|
60
|
+
|
|
61
|
+
[](https://github.com/zyekhabdul/markora/actions/workflows/ci.yml)
|
|
62
|
+
[](https://opensource.org/licenses/MIT)
|
|
63
|
+
[](https://www.python.org/downloads/)
|
|
64
|
+
[](https://github.com/zyekhabdul/markora)
|
|
65
|
+
|
|
66
|
+
**[Features](#-key-features)** •
|
|
67
|
+
**[Interactive TUI](#️-interactive-curses-tui)** •
|
|
68
|
+
**[1-Line Install](#-installation)** •
|
|
69
|
+
**[CLI Reference](#-cli-command-reference)** •
|
|
70
|
+
**[TUI Shortcuts](#️-tui-keyboard-shortcuts)** •
|
|
71
|
+
**[Google Keep Sync](#-google-keep-bidirectional-sync)** •
|
|
72
|
+
**[Configuration](#-configuration)**
|
|
73
|
+
|
|
74
|
+
---
|
|
75
|
+
|
|
76
|
+
</div>
|
|
77
|
+
|
|
78
|
+
## 💡 Why Markora?
|
|
79
|
+
|
|
80
|
+
If you love the simplicity, offline-first philosophy, and markdown-native architecture of the popular Android app **[Markor](https://github.com/gsantner/markor)**, **Markora** brings that exact seamless experience straight into your terminal.
|
|
81
|
+
|
|
82
|
+
- **Zero Cloud Lock-in**: Your data is 100% plain Markdown files in `~/Documents` (or your custom directory). You own your notes forever.
|
|
83
|
+
- **Zero Heavy Dependencies**: Core CLI and interactive TUI run entirely on the Python 3 standard library. No Electron bloat, no node_modules, no heavy frameworks.
|
|
84
|
+
- **Dual Personality**: Use lightning-fast one-liner CLI commands (`markora add`, `markora qn`) for scriptability, or fire up the rich interactive 4-tab Curses TUI (`markora ui`) for browsing, editing, and task triage.
|
|
85
|
+
- **Seamless Portability**: Sync your folder with Syncthing, Nextcloud, Git, or Android Markor without converting formats.
|
|
86
|
+
|
|
87
|
+
---
|
|
88
|
+
|
|
89
|
+
## ✨ Key Features
|
|
90
|
+
|
|
91
|
+
| Feature | Description |
|
|
92
|
+
| :--- | :--- |
|
|
93
|
+
| 📝 **QuickNote / Scratchpad** | Instant timestamped brain dumps saved directly to `quicknote.md`. |
|
|
94
|
+
| ✅ **To-Do & Milestones** | Parse and manage markdown task lists with priorities (`P1`, `P2`, `P3`), tags (`#urgent`, `@work`), sections, and sub-items. |
|
|
95
|
+
| 📚 **Notebook Tree** | Hierarchical directory tree with folding/unfolding, file counts, and folder creation. |
|
|
96
|
+
| ⭐ **Star & Pin Favorites** | Pin your most crucial notes to the top for instantaneous access. |
|
|
97
|
+
| 🔍 **Global Full-Text Search** | Real-time substring and regex search across all markdown files with direct line jumping into `$EDITOR`. |
|
|
98
|
+
| 🖱️ **Full Mouse & Keyboard** | Click tabs, check/uncheck tasks, fold folders, and scroll panes with full terminal mouse support. |
|
|
99
|
+
| 🔄 **Google Keep Bridge** | Optional bidirectional sync with Google Keep (`markora keep sync`) for seamless mobile-to-desktop workflow. |
|
|
100
|
+
|
|
101
|
+
---
|
|
102
|
+
|
|
103
|
+
## 🖥️ Interactive Curses TUI
|
|
104
|
+
|
|
105
|
+
Launch with `markora ui` (or alias `td ui`):
|
|
106
|
+
|
|
107
|
+
```
|
|
108
|
+
┌────────────────────────────────────────────────────────────────────────┐
|
|
109
|
+
│ MARKORA NOTEBOOK | SSOT: TODOLIST.md │
|
|
110
|
+
├────────────────────────────────────────────────────────────────────────┤
|
|
111
|
+
│ [1] QuickNote [2] To-Do [3] Notebook [4] Search Filter: (none)│
|
|
112
|
+
├──────────────────────────────────┬─────────────────────────────────────┤
|
|
113
|
+
│ > [✔] # 1 [P1] Deploy core v1.0 │ Task #1 Details │
|
|
114
|
+
│ [ ] # 2 [P2] Write user manual │ Section : ACTIVE TASKS │
|
|
115
|
+
│ [ ] # 3 [P3] Refactor keep api │ Status : DONE │
|
|
116
|
+
│ │ Priority: P1 │
|
|
117
|
+
│ │ Scope: Production release │
|
|
118
|
+
│ │ Deliverables: Clean package │
|
|
119
|
+
├──────────────────────────────────┴─────────────────────────────────────┤
|
|
120
|
+
│ [Space] Toggle [a] Add [r] Edit [d] Del [e] Editor [s] Sync Keep [q] │
|
|
121
|
+
└────────────────────────────────────────────────────────────────────────┘
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
---
|
|
125
|
+
|
|
126
|
+
## 📦 Installation
|
|
127
|
+
|
|
128
|
+
### Option 1: 1-Line Standalone Installer (Recommended)
|
|
129
|
+
|
|
130
|
+
```bash
|
|
131
|
+
curl -fsSL https://raw.githubusercontent.com/zyekhabdul/markora/main/install.sh | bash
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
This installs `markora` (and aliases `td`, `todo`, `mo`) into `~/.local/bin/`.
|
|
135
|
+
|
|
136
|
+
### Option 2: Pip / Pipx Installation
|
|
137
|
+
|
|
138
|
+
```bash
|
|
139
|
+
# Standard install (Zero external dependencies)
|
|
140
|
+
pip install git+https://github.com/zyekhabdul/markora.git
|
|
141
|
+
|
|
142
|
+
# With optional Google Keep synchronization
|
|
143
|
+
pip install "markora[keep] @ git+https://github.com/zyekhabdul/markora.git"
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
### Option 3: Manual Clone & Symlink
|
|
147
|
+
|
|
148
|
+
```bash
|
|
149
|
+
git clone https://github.com/zyekhabdul/markora.git ~/Projects/markora
|
|
150
|
+
cd ~/Projects/markora
|
|
151
|
+
make symlink
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
---
|
|
155
|
+
|
|
156
|
+
## 🚀 CLI Command Reference
|
|
157
|
+
|
|
158
|
+
All commands support both `markora` and the ultra-short alias `td`:
|
|
159
|
+
|
|
160
|
+
```bash
|
|
161
|
+
# --- QuickNotes ---
|
|
162
|
+
td qn "Remember to review pull request" # Append thought
|
|
163
|
+
td qn # View quicknotes
|
|
164
|
+
td qn -e # Edit in $EDITOR
|
|
165
|
+
|
|
166
|
+
# --- Task Management ---
|
|
167
|
+
td add "Ship version 1.0" -p p1 # Add high-priority task
|
|
168
|
+
td add "Research new indexing" -s "Inbox" # Add to specific section
|
|
169
|
+
td list # List all tasks
|
|
170
|
+
td list -p # Show only pending tasks
|
|
171
|
+
td list -d # Show completed tasks
|
|
172
|
+
td list -t #backend # Filter by tag
|
|
173
|
+
td done 1 3 # Complete tasks #1 and #3
|
|
174
|
+
td undone 2 # Mark task #2 pending
|
|
175
|
+
td toggle 1 # Toggle completion status
|
|
176
|
+
td rm 4 # Delete task #4
|
|
177
|
+
|
|
178
|
+
# --- Markdown Notebook ---
|
|
179
|
+
td note "System Architecture" # Create new note in notes/
|
|
180
|
+
td note -d # Open today's daily note
|
|
181
|
+
td notes # List all notebook files
|
|
182
|
+
td find "authentication" # Search across all notes
|
|
183
|
+
td fav list # List starred notes
|
|
184
|
+
td fav add notes/project.md # Star a note
|
|
185
|
+
|
|
186
|
+
# --- TUI & Integrations ---
|
|
187
|
+
td ui # Launch interactive 4-tab TUI
|
|
188
|
+
td keep auth # Connect Google Keep
|
|
189
|
+
td keep sync # Two-way sync with Keep
|
|
190
|
+
```
|
|
191
|
+
|
|
192
|
+
---
|
|
193
|
+
|
|
194
|
+
## ⌨️ TUI Keyboard Shortcuts
|
|
195
|
+
|
|
196
|
+
| Key | Context | Action |
|
|
197
|
+
| :--- | :--- | :--- |
|
|
198
|
+
| `1` / `2` / `3` / `4` | Global | Switch directly to Tab 1–4 |
|
|
199
|
+
| `Tab` | Global | Cycle to next tab |
|
|
200
|
+
| `j` / `k` / `↑` / `↓` | Navigation | Move cursor up / down |
|
|
201
|
+
| `g` / `G` | Navigation | Jump to top / bottom of list |
|
|
202
|
+
| `Space` / `x` | To-Do Tab | Toggle task checkbox (`[ ]` ↔ `[✔]`) |
|
|
203
|
+
| `a` | Global | Append QuickNote or Add To-Do task |
|
|
204
|
+
| `t` | QuickNote | Insert current timestamp log entry |
|
|
205
|
+
| `n` | Notebook | Create new `.md` note in highlighted folder |
|
|
206
|
+
| `N` / `m` | Notebook | Create new subfolder |
|
|
207
|
+
| `f` / `p` | Notebook | Star / Toggle Favorite note `[⭐]` |
|
|
208
|
+
| `r` / `R` | Global | Rename note/folder or edit task title |
|
|
209
|
+
| `d` | Global | Delete task, note, or directory (with confirmation) |
|
|
210
|
+
| `Enter` / `l` / `→` | Notebook | Open note in `$EDITOR` / Expand folder |
|
|
211
|
+
| `h` / `←` | Notebook | Collapse folder / Jump to parent folder |
|
|
212
|
+
| `e` | Global | Open current document in `$EDITOR` (`nvim`, `zed`, etc.) |
|
|
213
|
+
| `s` / `S` | Global | Trigger Google Keep bidirectional synchronization |
|
|
214
|
+
| `/` | Global | Live filter tree / search query |
|
|
215
|
+
| `Esc` | Global | Clear filter query |
|
|
216
|
+
| `Ctrl+R` | Global | Force reload data from disk |
|
|
217
|
+
| `?` | Global | Open interactive Keyboard Shortcut Help Modal |
|
|
218
|
+
| `q` | Global | Quit Markora |
|
|
219
|
+
|
|
220
|
+
---
|
|
221
|
+
|
|
222
|
+
## 🔄 Google Keep Bidirectional Sync
|
|
223
|
+
|
|
224
|
+
Markora includes a built-in sync engine that maps your Google Keep notes to your local markdown hierarchy:
|
|
225
|
+
|
|
226
|
+
- **Daily Notes** → Synced with Keep notes labeled `daily-notes`
|
|
227
|
+
- **QuickNote** → Synced with Keep note titled `QuickNote`
|
|
228
|
+
- **General Notes** → Synced with Keep notes labeled `notes`
|
|
229
|
+
|
|
230
|
+
### How to Authenticate:
|
|
231
|
+
|
|
232
|
+
```bash
|
|
233
|
+
# Install Keep dependencies
|
|
234
|
+
pip install "markora[keep]"
|
|
235
|
+
|
|
236
|
+
# Run interactive auth (automated browser popup or token paste)
|
|
237
|
+
markora keep auth
|
|
238
|
+
|
|
239
|
+
# Perform two-way sync
|
|
240
|
+
markora keep sync
|
|
241
|
+
```
|
|
242
|
+
|
|
243
|
+
---
|
|
244
|
+
|
|
245
|
+
## ⚙️ Configuration
|
|
246
|
+
|
|
247
|
+
Markora respects standard Unix configuration paradigms and environment variables:
|
|
248
|
+
|
|
249
|
+
| Environment Variable | Default | Purpose |
|
|
250
|
+
| :--- | :--- | :--- |
|
|
251
|
+
| `MARKORA_NOTES_DIR` / `NOTES_DIR` | `~/Documents` | Root directory for your markdown notes |
|
|
252
|
+
| `MARKORA_TODO_FILE` / `TODO_FILE` | `$NOTES_DIR/TODOLIST.md` | Master todolist markdown file |
|
|
253
|
+
| `EDITOR` / `VISUAL` | `nvim` (fallback: `zed`, `nano`, `vi`) | Preferred text editor |
|
|
254
|
+
|
|
255
|
+
Config files are stored in `~/.config/markora/` (with automatic fallback to `~/.config/td/`).
|
|
256
|
+
|
|
257
|
+
---
|
|
258
|
+
|
|
259
|
+
## 🐚 Shell Completion
|
|
260
|
+
|
|
261
|
+
Shell completion scripts for Bash and Zsh are located in [`completions/`](completions/):
|
|
262
|
+
|
|
263
|
+
```bash
|
|
264
|
+
# Bash
|
|
265
|
+
source <(cat completions/markora.bash)
|
|
266
|
+
|
|
267
|
+
# Zsh
|
|
268
|
+
cp completions/markora.zsh ~/.zsh/completion/_markora
|
|
269
|
+
```
|
|
270
|
+
|
|
271
|
+
---
|
|
272
|
+
|
|
273
|
+
## 🛠️ Development & Testing
|
|
274
|
+
|
|
275
|
+
```bash
|
|
276
|
+
git clone https://github.com/zyekhabdul/markora.git
|
|
277
|
+
cd markora
|
|
278
|
+
|
|
279
|
+
# Setup editable install with test dependencies
|
|
280
|
+
make dev
|
|
281
|
+
|
|
282
|
+
# Run comprehensive test suite
|
|
283
|
+
make test
|
|
284
|
+
|
|
285
|
+
# Lint & syntax validation
|
|
286
|
+
make lint
|
|
287
|
+
```
|
|
288
|
+
|
|
289
|
+
---
|
|
290
|
+
|
|
291
|
+
## 📄 License
|
|
292
|
+
|
|
293
|
+
MIT License © 2026 [zyekhabdul](https://github.com/zyekhabdul).
|
|
294
|
+
Built with craftsmanship for sovereign terminal enthusiasts.
|
markora-1.0.0/README.md
ADDED
|
@@ -0,0 +1,247 @@
|
|
|
1
|
+
<div align="center">
|
|
2
|
+
|
|
3
|
+
```
|
|
4
|
+
__ __ _
|
|
5
|
+
| \/ | | |
|
|
6
|
+
| \ / | __ _ _ __| | _____ _ __ __ _
|
|
7
|
+
| |\/| |/ _` | '__| |/ / _ \| '__/ _` |
|
|
8
|
+
| | | | (_| | | | < (_) | | | (_| |
|
|
9
|
+
|_| |_|\__,_|_| |_|\_\___/|_| \__,_|
|
|
10
|
+
```
|
|
11
|
+
|
|
12
|
+
### ⚡ Sovereign Markor-style Markdown Notebook, QuickNotes & Todo TUI for Terminal Power Users
|
|
13
|
+
|
|
14
|
+
[](https://github.com/zyekhabdul/markora/actions/workflows/ci.yml)
|
|
15
|
+
[](https://opensource.org/licenses/MIT)
|
|
16
|
+
[](https://www.python.org/downloads/)
|
|
17
|
+
[](https://github.com/zyekhabdul/markora)
|
|
18
|
+
|
|
19
|
+
**[Features](#-key-features)** •
|
|
20
|
+
**[Interactive TUI](#️-interactive-curses-tui)** •
|
|
21
|
+
**[1-Line Install](#-installation)** •
|
|
22
|
+
**[CLI Reference](#-cli-command-reference)** •
|
|
23
|
+
**[TUI Shortcuts](#️-tui-keyboard-shortcuts)** •
|
|
24
|
+
**[Google Keep Sync](#-google-keep-bidirectional-sync)** •
|
|
25
|
+
**[Configuration](#-configuration)**
|
|
26
|
+
|
|
27
|
+
---
|
|
28
|
+
|
|
29
|
+
</div>
|
|
30
|
+
|
|
31
|
+
## 💡 Why Markora?
|
|
32
|
+
|
|
33
|
+
If you love the simplicity, offline-first philosophy, and markdown-native architecture of the popular Android app **[Markor](https://github.com/gsantner/markor)**, **Markora** brings that exact seamless experience straight into your terminal.
|
|
34
|
+
|
|
35
|
+
- **Zero Cloud Lock-in**: Your data is 100% plain Markdown files in `~/Documents` (or your custom directory). You own your notes forever.
|
|
36
|
+
- **Zero Heavy Dependencies**: Core CLI and interactive TUI run entirely on the Python 3 standard library. No Electron bloat, no node_modules, no heavy frameworks.
|
|
37
|
+
- **Dual Personality**: Use lightning-fast one-liner CLI commands (`markora add`, `markora qn`) for scriptability, or fire up the rich interactive 4-tab Curses TUI (`markora ui`) for browsing, editing, and task triage.
|
|
38
|
+
- **Seamless Portability**: Sync your folder with Syncthing, Nextcloud, Git, or Android Markor without converting formats.
|
|
39
|
+
|
|
40
|
+
---
|
|
41
|
+
|
|
42
|
+
## ✨ Key Features
|
|
43
|
+
|
|
44
|
+
| Feature | Description |
|
|
45
|
+
| :--- | :--- |
|
|
46
|
+
| 📝 **QuickNote / Scratchpad** | Instant timestamped brain dumps saved directly to `quicknote.md`. |
|
|
47
|
+
| ✅ **To-Do & Milestones** | Parse and manage markdown task lists with priorities (`P1`, `P2`, `P3`), tags (`#urgent`, `@work`), sections, and sub-items. |
|
|
48
|
+
| 📚 **Notebook Tree** | Hierarchical directory tree with folding/unfolding, file counts, and folder creation. |
|
|
49
|
+
| ⭐ **Star & Pin Favorites** | Pin your most crucial notes to the top for instantaneous access. |
|
|
50
|
+
| 🔍 **Global Full-Text Search** | Real-time substring and regex search across all markdown files with direct line jumping into `$EDITOR`. |
|
|
51
|
+
| 🖱️ **Full Mouse & Keyboard** | Click tabs, check/uncheck tasks, fold folders, and scroll panes with full terminal mouse support. |
|
|
52
|
+
| 🔄 **Google Keep Bridge** | Optional bidirectional sync with Google Keep (`markora keep sync`) for seamless mobile-to-desktop workflow. |
|
|
53
|
+
|
|
54
|
+
---
|
|
55
|
+
|
|
56
|
+
## 🖥️ Interactive Curses TUI
|
|
57
|
+
|
|
58
|
+
Launch with `markora ui` (or alias `td ui`):
|
|
59
|
+
|
|
60
|
+
```
|
|
61
|
+
┌────────────────────────────────────────────────────────────────────────┐
|
|
62
|
+
│ MARKORA NOTEBOOK | SSOT: TODOLIST.md │
|
|
63
|
+
├────────────────────────────────────────────────────────────────────────┤
|
|
64
|
+
│ [1] QuickNote [2] To-Do [3] Notebook [4] Search Filter: (none)│
|
|
65
|
+
├──────────────────────────────────┬─────────────────────────────────────┤
|
|
66
|
+
│ > [✔] # 1 [P1] Deploy core v1.0 │ Task #1 Details │
|
|
67
|
+
│ [ ] # 2 [P2] Write user manual │ Section : ACTIVE TASKS │
|
|
68
|
+
│ [ ] # 3 [P3] Refactor keep api │ Status : DONE │
|
|
69
|
+
│ │ Priority: P1 │
|
|
70
|
+
│ │ Scope: Production release │
|
|
71
|
+
│ │ Deliverables: Clean package │
|
|
72
|
+
├──────────────────────────────────┴─────────────────────────────────────┤
|
|
73
|
+
│ [Space] Toggle [a] Add [r] Edit [d] Del [e] Editor [s] Sync Keep [q] │
|
|
74
|
+
└────────────────────────────────────────────────────────────────────────┘
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
---
|
|
78
|
+
|
|
79
|
+
## 📦 Installation
|
|
80
|
+
|
|
81
|
+
### Option 1: 1-Line Standalone Installer (Recommended)
|
|
82
|
+
|
|
83
|
+
```bash
|
|
84
|
+
curl -fsSL https://raw.githubusercontent.com/zyekhabdul/markora/main/install.sh | bash
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
This installs `markora` (and aliases `td`, `todo`, `mo`) into `~/.local/bin/`.
|
|
88
|
+
|
|
89
|
+
### Option 2: Pip / Pipx Installation
|
|
90
|
+
|
|
91
|
+
```bash
|
|
92
|
+
# Standard install (Zero external dependencies)
|
|
93
|
+
pip install git+https://github.com/zyekhabdul/markora.git
|
|
94
|
+
|
|
95
|
+
# With optional Google Keep synchronization
|
|
96
|
+
pip install "markora[keep] @ git+https://github.com/zyekhabdul/markora.git"
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
### Option 3: Manual Clone & Symlink
|
|
100
|
+
|
|
101
|
+
```bash
|
|
102
|
+
git clone https://github.com/zyekhabdul/markora.git ~/Projects/markora
|
|
103
|
+
cd ~/Projects/markora
|
|
104
|
+
make symlink
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
---
|
|
108
|
+
|
|
109
|
+
## 🚀 CLI Command Reference
|
|
110
|
+
|
|
111
|
+
All commands support both `markora` and the ultra-short alias `td`:
|
|
112
|
+
|
|
113
|
+
```bash
|
|
114
|
+
# --- QuickNotes ---
|
|
115
|
+
td qn "Remember to review pull request" # Append thought
|
|
116
|
+
td qn # View quicknotes
|
|
117
|
+
td qn -e # Edit in $EDITOR
|
|
118
|
+
|
|
119
|
+
# --- Task Management ---
|
|
120
|
+
td add "Ship version 1.0" -p p1 # Add high-priority task
|
|
121
|
+
td add "Research new indexing" -s "Inbox" # Add to specific section
|
|
122
|
+
td list # List all tasks
|
|
123
|
+
td list -p # Show only pending tasks
|
|
124
|
+
td list -d # Show completed tasks
|
|
125
|
+
td list -t #backend # Filter by tag
|
|
126
|
+
td done 1 3 # Complete tasks #1 and #3
|
|
127
|
+
td undone 2 # Mark task #2 pending
|
|
128
|
+
td toggle 1 # Toggle completion status
|
|
129
|
+
td rm 4 # Delete task #4
|
|
130
|
+
|
|
131
|
+
# --- Markdown Notebook ---
|
|
132
|
+
td note "System Architecture" # Create new note in notes/
|
|
133
|
+
td note -d # Open today's daily note
|
|
134
|
+
td notes # List all notebook files
|
|
135
|
+
td find "authentication" # Search across all notes
|
|
136
|
+
td fav list # List starred notes
|
|
137
|
+
td fav add notes/project.md # Star a note
|
|
138
|
+
|
|
139
|
+
# --- TUI & Integrations ---
|
|
140
|
+
td ui # Launch interactive 4-tab TUI
|
|
141
|
+
td keep auth # Connect Google Keep
|
|
142
|
+
td keep sync # Two-way sync with Keep
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
---
|
|
146
|
+
|
|
147
|
+
## ⌨️ TUI Keyboard Shortcuts
|
|
148
|
+
|
|
149
|
+
| Key | Context | Action |
|
|
150
|
+
| :--- | :--- | :--- |
|
|
151
|
+
| `1` / `2` / `3` / `4` | Global | Switch directly to Tab 1–4 |
|
|
152
|
+
| `Tab` | Global | Cycle to next tab |
|
|
153
|
+
| `j` / `k` / `↑` / `↓` | Navigation | Move cursor up / down |
|
|
154
|
+
| `g` / `G` | Navigation | Jump to top / bottom of list |
|
|
155
|
+
| `Space` / `x` | To-Do Tab | Toggle task checkbox (`[ ]` ↔ `[✔]`) |
|
|
156
|
+
| `a` | Global | Append QuickNote or Add To-Do task |
|
|
157
|
+
| `t` | QuickNote | Insert current timestamp log entry |
|
|
158
|
+
| `n` | Notebook | Create new `.md` note in highlighted folder |
|
|
159
|
+
| `N` / `m` | Notebook | Create new subfolder |
|
|
160
|
+
| `f` / `p` | Notebook | Star / Toggle Favorite note `[⭐]` |
|
|
161
|
+
| `r` / `R` | Global | Rename note/folder or edit task title |
|
|
162
|
+
| `d` | Global | Delete task, note, or directory (with confirmation) |
|
|
163
|
+
| `Enter` / `l` / `→` | Notebook | Open note in `$EDITOR` / Expand folder |
|
|
164
|
+
| `h` / `←` | Notebook | Collapse folder / Jump to parent folder |
|
|
165
|
+
| `e` | Global | Open current document in `$EDITOR` (`nvim`, `zed`, etc.) |
|
|
166
|
+
| `s` / `S` | Global | Trigger Google Keep bidirectional synchronization |
|
|
167
|
+
| `/` | Global | Live filter tree / search query |
|
|
168
|
+
| `Esc` | Global | Clear filter query |
|
|
169
|
+
| `Ctrl+R` | Global | Force reload data from disk |
|
|
170
|
+
| `?` | Global | Open interactive Keyboard Shortcut Help Modal |
|
|
171
|
+
| `q` | Global | Quit Markora |
|
|
172
|
+
|
|
173
|
+
---
|
|
174
|
+
|
|
175
|
+
## 🔄 Google Keep Bidirectional Sync
|
|
176
|
+
|
|
177
|
+
Markora includes a built-in sync engine that maps your Google Keep notes to your local markdown hierarchy:
|
|
178
|
+
|
|
179
|
+
- **Daily Notes** → Synced with Keep notes labeled `daily-notes`
|
|
180
|
+
- **QuickNote** → Synced with Keep note titled `QuickNote`
|
|
181
|
+
- **General Notes** → Synced with Keep notes labeled `notes`
|
|
182
|
+
|
|
183
|
+
### How to Authenticate:
|
|
184
|
+
|
|
185
|
+
```bash
|
|
186
|
+
# Install Keep dependencies
|
|
187
|
+
pip install "markora[keep]"
|
|
188
|
+
|
|
189
|
+
# Run interactive auth (automated browser popup or token paste)
|
|
190
|
+
markora keep auth
|
|
191
|
+
|
|
192
|
+
# Perform two-way sync
|
|
193
|
+
markora keep sync
|
|
194
|
+
```
|
|
195
|
+
|
|
196
|
+
---
|
|
197
|
+
|
|
198
|
+
## ⚙️ Configuration
|
|
199
|
+
|
|
200
|
+
Markora respects standard Unix configuration paradigms and environment variables:
|
|
201
|
+
|
|
202
|
+
| Environment Variable | Default | Purpose |
|
|
203
|
+
| :--- | :--- | :--- |
|
|
204
|
+
| `MARKORA_NOTES_DIR` / `NOTES_DIR` | `~/Documents` | Root directory for your markdown notes |
|
|
205
|
+
| `MARKORA_TODO_FILE` / `TODO_FILE` | `$NOTES_DIR/TODOLIST.md` | Master todolist markdown file |
|
|
206
|
+
| `EDITOR` / `VISUAL` | `nvim` (fallback: `zed`, `nano`, `vi`) | Preferred text editor |
|
|
207
|
+
|
|
208
|
+
Config files are stored in `~/.config/markora/` (with automatic fallback to `~/.config/td/`).
|
|
209
|
+
|
|
210
|
+
---
|
|
211
|
+
|
|
212
|
+
## 🐚 Shell Completion
|
|
213
|
+
|
|
214
|
+
Shell completion scripts for Bash and Zsh are located in [`completions/`](completions/):
|
|
215
|
+
|
|
216
|
+
```bash
|
|
217
|
+
# Bash
|
|
218
|
+
source <(cat completions/markora.bash)
|
|
219
|
+
|
|
220
|
+
# Zsh
|
|
221
|
+
cp completions/markora.zsh ~/.zsh/completion/_markora
|
|
222
|
+
```
|
|
223
|
+
|
|
224
|
+
---
|
|
225
|
+
|
|
226
|
+
## 🛠️ Development & Testing
|
|
227
|
+
|
|
228
|
+
```bash
|
|
229
|
+
git clone https://github.com/zyekhabdul/markora.git
|
|
230
|
+
cd markora
|
|
231
|
+
|
|
232
|
+
# Setup editable install with test dependencies
|
|
233
|
+
make dev
|
|
234
|
+
|
|
235
|
+
# Run comprehensive test suite
|
|
236
|
+
make test
|
|
237
|
+
|
|
238
|
+
# Lint & syntax validation
|
|
239
|
+
make lint
|
|
240
|
+
```
|
|
241
|
+
|
|
242
|
+
---
|
|
243
|
+
|
|
244
|
+
## 📄 License
|
|
245
|
+
|
|
246
|
+
MIT License © 2026 [zyekhabdul](https://github.com/zyekhabdul).
|
|
247
|
+
Built with craftsmanship for sovereign terminal enthusiasts.
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
[build-system]
|
|
2
|
+
requires = ["setuptools>=61.0", "wheel"]
|
|
3
|
+
build-backend = "setuptools.build_meta"
|
|
4
|
+
|
|
5
|
+
[project]
|
|
6
|
+
name = "markora"
|
|
7
|
+
version = "1.0.0"
|
|
8
|
+
description = "⚡ Sovereign Markor-style Markdown Notebook, QuickNotes & Todo TUI for Terminal Power Users"
|
|
9
|
+
readme = "README.md"
|
|
10
|
+
requires-python = ">=3.8"
|
|
11
|
+
license = { text = "MIT" }
|
|
12
|
+
authors = [
|
|
13
|
+
{ name = "zyekhabdul", email = "zyekhabdulqadirjailani@gmail.com" }
|
|
14
|
+
]
|
|
15
|
+
keywords = [
|
|
16
|
+
"markora",
|
|
17
|
+
"markor",
|
|
18
|
+
"markdown",
|
|
19
|
+
"notes",
|
|
20
|
+
"notebook",
|
|
21
|
+
"todo",
|
|
22
|
+
"tui",
|
|
23
|
+
"curses",
|
|
24
|
+
"google-keep",
|
|
25
|
+
"productivity",
|
|
26
|
+
"cli",
|
|
27
|
+
"terminal"
|
|
28
|
+
]
|
|
29
|
+
classifiers = [
|
|
30
|
+
"Development Status :: 5 - Production/Stable",
|
|
31
|
+
"Environment :: Console",
|
|
32
|
+
"Environment :: Console :: Curses",
|
|
33
|
+
"Intended Audience :: Developers",
|
|
34
|
+
"Intended Audience :: End Users/Desktop",
|
|
35
|
+
"License :: OSI Approved :: MIT License",
|
|
36
|
+
"Operating System :: POSIX :: Linux",
|
|
37
|
+
"Operating System :: MacOS",
|
|
38
|
+
"Programming Language :: Python :: 3",
|
|
39
|
+
"Programming Language :: Python :: 3.8",
|
|
40
|
+
"Programming Language :: Python :: 3.9",
|
|
41
|
+
"Programming Language :: Python :: 3.10",
|
|
42
|
+
"Programming Language :: Python :: 3.11",
|
|
43
|
+
"Programming Language :: Python :: 3.12",
|
|
44
|
+
"Programming Language :: Python :: 3.13",
|
|
45
|
+
"Programming Language :: Python :: 3.14",
|
|
46
|
+
"Topic :: Text Editors",
|
|
47
|
+
"Topic :: Utilities"
|
|
48
|
+
]
|
|
49
|
+
dependencies = []
|
|
50
|
+
|
|
51
|
+
[project.optional-dependencies]
|
|
52
|
+
keep = [
|
|
53
|
+
"gkeepapi>=0.14.0",
|
|
54
|
+
"gpsoauth>=1.0.0"
|
|
55
|
+
]
|
|
56
|
+
browser-auth = [
|
|
57
|
+
"playwright>=1.40.0"
|
|
58
|
+
]
|
|
59
|
+
all = [
|
|
60
|
+
"gkeepapi>=0.14.0",
|
|
61
|
+
"gpsoauth>=1.0.0",
|
|
62
|
+
"playwright>=1.40.0"
|
|
63
|
+
]
|
|
64
|
+
dev = [
|
|
65
|
+
"pytest>=7.0.0",
|
|
66
|
+
"pytest-cov>=4.0.0",
|
|
67
|
+
"flake8>=6.0.0"
|
|
68
|
+
]
|
|
69
|
+
|
|
70
|
+
[project.scripts]
|
|
71
|
+
markora = "markora.cli:main"
|
|
72
|
+
td = "markora.cli:main"
|
|
73
|
+
todo = "markora.cli:main"
|
|
74
|
+
mo = "markora.cli:main"
|
|
75
|
+
|
|
76
|
+
[project.urls]
|
|
77
|
+
Homepage = "https://github.com/zyekhabdul/markora"
|
|
78
|
+
Repository = "https://github.com/zyekhabdul/markora.git"
|
|
79
|
+
Issues = "https://github.com/zyekhabdul/markora/issues"
|
|
80
|
+
Changelog = "https://github.com/zyekhabdul/markora/blob/main/CHANGELOG.md"
|
|
81
|
+
|
|
82
|
+
[tool.setuptools.packages.find]
|
|
83
|
+
where = ["src"]
|
|
84
|
+
|
|
85
|
+
[tool.pytest.ini_options]
|
|
86
|
+
testpaths = ["tests"]
|
|
87
|
+
python_files = ["test_*.py"]
|
|
88
|
+
addopts = "-v"
|
markora-1.0.0/setup.cfg
ADDED
markora-1.0.0/setup.py
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
from setuptools import setup, find_packages
|
|
3
|
+
|
|
4
|
+
setup(
|
|
5
|
+
name="markora",
|
|
6
|
+
version="1.0.0",
|
|
7
|
+
package_dir={"": "src"},
|
|
8
|
+
packages=find_packages(where="src"),
|
|
9
|
+
entry_points={
|
|
10
|
+
"console_scripts": [
|
|
11
|
+
"markora = markora.cli:main",
|
|
12
|
+
"td = markora.cli:main",
|
|
13
|
+
"todo = markora.cli:main",
|
|
14
|
+
"mo = markora.cli:main",
|
|
15
|
+
],
|
|
16
|
+
},
|
|
17
|
+
)
|