A powerful terminal-based task and note management application built with Python and Textual.
- Project-Based Organization: Group related tasks and notes into separate projects with custom titles and descriptions
- Task Management:
- Create, edit, and delete tasks with titles and markdown content
- Track task status with 5 different states: Not started, In progress, Under review, Done, and Canceled
- Search tasks in real-time as you type
- Visual status indicators (○, ◐, ◎, ✓, ✗)
- Rich Text Support: Write task content in Markdown with syntax highlighting
- Project Import/Export: Share and backup projects across systems
- Keyboard-Driven Interface: Navigate and manage tasks efficiently without touching the mouse
- Persistent Storage: SQLite database ensures your data is saved automatically
- Modern Terminal UI: Beautiful interface powered by Textual framework
- Using pip
pip install xnoted- Using pipx
pipx install xnoted- Python >= 3.11
- Dependencies:
- textual >= 6.6.0
- textual-dev >= 1.8.0
- Clone the repository:
git clone git@github.com:babucarr32/xnoted.git
cd xnoted- Install dependencies using uv:
uv syncOr using pip:
pip install -e .Or using requirements.txt:
pip install -r requirements.txt- Activate the virtual environment:
macOS/Linux (Bash/Zsh):
source .venv/bin/activateWindows (Command Prompt):
.venv\Scripts\activate.bat- Run the application:
textual run --dev main.pyOr for production use:
python main.pyTextual provides excellent development tools:
# Run with live reload and dev console
textual run --dev main.py
# Open the development console in another terminal
textual consoleThe dev console shows real-time logs and application state for debugging.
- Install hatch
- To build your project with Hatch, change to the directory containing your pyproject.toml and run the hatch build subcommand:
cd textual-calculator
hatch build- The output will be in the
distfolder
For more info see Package with Hatch
To install the local build
pipx install --force .or
pip install --force .- First Launch: The app creates a default project automatically
- Create a Task: Press
Ctrl+nto open the task creation modal - Navigate Tasks: Use
jandkto move up and down the task list - View Task Content: Select a task with
Enterto view its content in the right panel - Edit a Task: Highlight a task and press
eto edit it - Change Status: Use arrow keys (
←/→) to cycle through task statuses - Create Projects: Press
Ctrl+bto create new projects - Switch Projects: Press
Ctrl+lto select a different project
| Shortcut | Action | Description |
|---|---|---|
ctrl+n |
Create new task | Opens modal to create a new task in current project |
ctrl+b |
Create new project | Opens modal to create a new project |
ctrl+l |
Select project | Opens project selector to switch between projects |
ctrl+o |
Import/Export | Opens modal to import or export projects |
ctrl+r |
Show readme | Displays the README in the content panel |
ctrl+d |
Scroll down | Scrolls the content panel down |
ctrl+u |
Scroll up | Scrolls the content panel up |
u |
Unlock tasks | Unlock all locked tasks |
ctrl+p |
Command pallette | Display command pallette |
s |
Command pallette | Display command pallette |
L |
Create password / Edit password | Create or edit password |
| Shortcut | Action | Description |
|---|---|---|
j |
Move down | Move cursor down in task list |
k |
Move up | Move cursor up in task list |
enter |
Select task | View the selected task's content |
e |
Edit task | Edit the highlighted task |
m |
Move task | Move the highlighted task |
c |
Copy task | Copy the highlighted task |
l |
Lock task / Permanently unlock task | Lock or permanently unlock the highlighted task |
d |
Delete task | Delete the highlighted task (with confirmation) |
← |
Previous status | Cycle task status backward |
→ |
Next status | Cycle task status forward |
/ |
Search | Search the tasks |
| Shortcut | Action | Description |
|---|---|---|
j |
Move down | Move cursor down in task list |
k |
Move up | Move cursor up in task list |
e |
Edit project | Edit the highlighted project |
d |
Delete project | Delete the highlighted project (with confirmation) |
| Shortcut | Action | Description |
|---|---|---|
j |
Move down | Move cursor down in copy task list |
k |
Move up | Move cursor up in copy task list |
| Shortcut | Action | Description |
|---|---|---|
enter |
Save | Save the current changes |
escape |
Cancel | Close modal without saving |
- ○ Not started - Task hasn't been started yet
- ◐ In progress - Task is actively being worked on
- ◎ Under review - Task is waiting for review
- ✓ Done - Task is verified complete
- ✗ Canceled - Task was canceled or won't be done
Project data structure sample
{
"version": "1.0",
"exported_at": "2026-01-18T14:30:00.000000",
"project": {
"id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"title": "Website Redesign",
"description": "Complete redesign of company website with modern UI/UX",
"type": "tasks",
"createdAt": "2025-12-15 10:00:00"
},
"tasks": [
{
"id": "task-001-uuid-1234",
"title": "Research competitor websites",
"content": "Analyze top 5 competitor websites and document design patterns, user flows, and features. Focus on:\n- Navigation structure\n- Color schemes\n- Typography choices\n- Mobile responsiveness\n- Accessibility features",
"is_protected": 1,
"status": 1,
"createdAt": "2025-12-15 10:15:00"
}
],
"task_count": 8
}
xNoted is built with Textual, a modern Python framework for building terminal user interfaces. The app follows a component-based architecture:
-
XNotedApp (
src/xnoted/app.py): Main application class that handles:- Global keyboard bindings
- Screen navigation and modal management
- Database initialization
-
Database (
src/xnoted/utils/database.py): SQLite wrapper providing:- Project and task CRUD operations
- Automatic schema initialization
- Current project context management
- Default project creation on first run
-
Screens (
src/xnoted/screens/): Modal overlays for user interactions:- Task creation and editing
- Project creation and selection
- Import/export functionality
- Confirmation dialogs
-
Components (
src/xnoted/components/): Reusable UI building blocks:- Task list with search and navigation
- Markdown content viewer
- Form inputs for tasks and projects
The SQLite database contains two main tables:
Projects:
id(TEXT, PRIMARY KEY): Unique project identifiertitle(TEXT): Project namedescription(TEXT): Project descriptiontype(TEXT): Project type (e.g., "task", "other")createdAt(TEXT): Creation timestamp
Tasks:
id(TEXT, PRIMARY KEY): Unique task identifierproject_id(TEXT, FOREIGN KEY): Reference to parent projecttitle(TEXT): Task titlecontent(TEXT): Task content in Markdownstatus(INTEGER): Status index (0-5)createdAt(TEXT): Creation timestamp
Linux:~/.local/share/xnoted/macOS:~/Library/Application Support/xnoted/Windows:C:\Users\YourName\AppData\Roaming\xnoted\
Linux:~/.local/share/xnoted/log.txtmacOS:~/Library/Application Support/xnoted/log.txtWindows:C:\Users\YourName\AppData\Roaming\xnoted\log.txt
MIT
