Skip to main content

Keyboard-first desktop tracker for the projects, playlists, and notes that live in a folder on your disk.

Project description

Projectum

A keyboard-first desktop tracker for the projects, playlists, tasks, and notes that live in a folder on your disk.

CI Release Downloads Python 3.10+ PySide6 License: MIT

No servers. No accounts. No telemetry. Your data is one JSON file next to your work.

Projectum — projects view


What it is

Point Projectum at a folder and every subfolder becomes a project you can mark done and tested, tag with colors, annotate with live‑rendered Markdown, pin, and reorder. The same window tracks YouTube playlists — titles, durations, watched state, and per‑video notes via yt-dlp — keeps a to‑do list and a folder‑wide scratchpad. A Ctrl+K command palette searches across all of it.

Everything for a folder is stored in a single, human‑readable .projectum.json inside it — so it travels with your work, diffs cleanly in Git, and is trivial to back up or delete.

Download

Linux — AppImage (recommended)

Grab the latest self‑contained build, mark it executable, and run it. No Python, no pip, nothing to install.

wget https://github.com/wleeaf/projectum/releases/latest/download/Projectum-x86_64.AppImage
chmod +x Projectum-x86_64.AppImage
./Projectum-x86_64.AppImage

The AppImage bundles Python, Qt, PySide6, and yt-dlp, and runs on any reasonably modern x86‑64 desktop (glibc ≥ 2.17).

Windows & macOS

Grab Projectum-windows-x64.exe or Projectum-macos.dmg from the latest release.

Note: these builds are unsigned, so the OS will warn on first launch.

  • Windows: SmartScreen → More info → Run anyway.
  • macOS: right‑click the app → Open (or System Settings → Privacy & Security → Open Anyway).

If in doubt, running from source (below) avoids the warnings entirely.

pip (any platform with Python ≥ 3.10)

pip install projectum
projectum

From source (Linux · macOS · Windows)

Requires Python ≥ 3.10.

git clone https://github.com/wleeaf/projectum.git
cd projectum
python -m venv .venv
source .venv/bin/activate          # Windows: .venv\Scripts\activate
pip install -r requirements.txt
python main.py                     # or: python main.py ~/code

Projectum remembers the last folder you opened, so later launches go straight back to it.

Features

  • Filesystem‑backed projects. Any folder works; each subfolder is a project. State lives in one .projectum.json per folder — Git‑friendly, sync‑friendly, no database.
  • YouTube playlists with per‑video tracking. Paste a URL, yt-dlp fetches the metadata, tick videos off as you watch, and keep notes per video. Refresh later pulls in new uploads while preserving your progress; videos removed upstream are kept and flagged.
  • Live WYSIWYG Markdown in every notes pane. Headings, bold/italic, inline and fenced code, lists, blockquotes, strikethrough, and links render as you type — the syntax markers stay dimmed but present, so it's still plain editable Markdown with no separate preview.
  • A folder-scoped Todo list — quick tasks per folder: add, check off, double‑click to edit inline, delete, and drag to reorder, with a done/total counter.
  • Project quick-actions — right‑click a project to open its folder, copy its path, open a terminal there, or open it in your editor (VS Code / Cursor / Zed / Sublime when on PATH).
  • Git-aware — the detail panel shows a project's current branch and whether its working tree is dirty, read off the UI thread.
  • Recent-folders menu — a Recent ▾ button to jump back between the folders you track.
  • Tags with custom colors (right‑click any chip), an automatic cleanup that drops unused colors, and a sidebar tag filter.
  • Done + Tested toggles per project — a green check and a blue one; tested projects render in blue in the sidebar.
  • Pin & drag‑to‑reorder projects and playlists; pinned items float to the top.
  • Command palette (Ctrl+K) over projects, playlists, videos, tags, and the scratchpad, with prefix‑match ranking and type‑ahead.
  • 19 built‑in themes spanning the spectrum — distinctive ones like Midnight (true‑black OLED), Synthwave (neon), Ember (warm orange‑red), Graphite (colorless mono) and Paper (crisp white) alongside Catppuccin Mocha / Latte / Macchiato, Nord, Dracula, Tokyo Night, Rosé Pine, One Dark, GitHub Dark, Everforest, Gruvbox Dark / Light, and Solarized Dark / Light. Every theme is held to a WCAG contrast bar so text stays readable, previewed by a color swatch in the picker, and crossfaded when you switch. Plus any installed font at any size.
  • Frameless, animated UI with smooth wheel scrolling, custom title bar, edge‑resize, and flicker‑free crossfade transitions.
  • Update notifications — a quiet banner when a newer release is out (one read-only GitHub check on launch, opt-out in Settings — no telemetry).
  • Resilient state. Writes are atomic; a folder that disappears (rename, git checkout) has its metadata preserved and restored when it returns.

Screenshots

Projects — tagged, pinned, tested
Projects
Playlists — videos, watched count, notes
Playlists
Notes — folder‑wide scratchpad, live Markdown
Notes
Command paletteCtrl+K over everything
Palette
Settings — theme, font family, font size
Settings
Light theme — same app, Catppuccin Latte
Light

Usage

Projects — Each subfolder of the chosen root is a row. Toggle done (green) or tested (blue); tested projects show their name in blue. Tags are inline chips — right‑click to recolor, click the × to remove, and filter by tag from the Tag chip at the top of the sidebar. Drag rows to reorder, or right‑click for Pin to top and quick actions (Open folder / Copy path / Open in terminal / Open in editor). The detail panel shows the folder's size, last‑modified time, and git branch + dirty state; the notes editor renders Markdown live, in place.

Playlists+ Add YouTube playlist prompts for a URL; yt-dlp fetches the title, uploader, and every video. Refresh re‑syncs while keeping your watched/notes state. Tag, pin, reorder, and write per‑playlist notes; each video has its own notes pane below the list.

Todo — A folder‑scoped task list. Type a task and press Enter to add it; tick the toggle to complete it (it strikes through), double‑click the text to edit inline, drag to reorder, and use the × to delete. A counter shows how many are done.

Notes — A single, folder‑wide scratchpad with live WYSIWYG Markdown and a search bar ( / Shift+↵ to jump between matches).

Command paletteCtrl+K from anywhere. Type to filter projects, playlists, videos, tags, and the scratchpad; / to navigate, to open, Esc to dismiss.

Settings — The gear icon opens dropdowns for theme (each previewed with a color swatch), font family (select-only, every family shown in its own font), and font size (preset pixels), plus a Check for updates on launch toggle. Changes are staged and applied only when you click Apply, then persist across launches.

Keyboard shortcuts

Shortcut Action
Ctrl+K Open the command palette
Ctrl+1Ctrl+4 Switch tab (Projects / Playlists / Todo / Notes)
Ctrl+O Open a folder
Ctrl+F Focus the sidebar search
Ctrl+D Toggle the selected project's done state
Ctrl+T Jump to Todo and start a new task
Ctrl+N Focus the project notes editor
Ctrl+R Refresh the current folder
/ Shift+↵ Next / previous match in Notes search
Esc Close a popup (color picker, settings, palette)

Data & storage

All state for a folder lives in <folder>/.projectum.json — a single JSON document holding projects, playlists, tags, notes, pins, and ordering. Commit it alongside your work or .gitignore it; it's yours. Writes are atomic (write‑temp‑then‑rename), so an interrupted save never corrupts the file.

The only thing written outside your folders is ~/.config/projectum/state.json (or $XDG_CONFIG_HOME), which remembers your window geometry, last‑opened folder, and theme/font settings.

When a project folder disappears (rename, branch switch), its metadata — completion, notes, tags, pins, order — is parked in an _orphans bucket and restored intact if the folder reappears.

Project layout

projectum/
├── main.py                  # entry point
├── projectum/
│   ├── app.py               # MainWindow + run()
│   ├── store.py             # Project / Playlist / Video / ProjectStore
│   ├── widgets.py           # custom-painted widgets (chips, toggles, palette, …)
│   ├── theme.py             # 19 themes + contrast helpers + stylesheet builder
│   ├── anims.py             # crossfade / slide / progress / smooth-scroll helpers
│   ├── youtube.py           # yt-dlp fetch runnable
│   └── assets/icon.svg
├── packaging/appimage/      # AppImage recipe + build script
├── .github/workflows/       # CI + release (AppImage) pipelines
├── requirements.txt
└── docs/screenshots/

Development

python -m venv .venv && source .venv/bin/activate
pip install -r requirements.txt
python main.py

The codebase is deliberately dependency‑light: PySide6 for the UI, yt-dlp for playlist metadata, and the standard library for everything else. Continuous integration runs ruff, byte‑compiles every module, runs the headless pytest suite, and boots MainWindow on an offscreen display across Python 3.10–3.12 on Linux, macOS, and Windows.

Run the tests locally with:

pip install pytest
QT_QPA_PLATFORM=offscreen pytest -q

Building the AppImage locally

pip install python-appimage build
./packaging/appimage/build-appimage.sh
# -> build/appimage/Projectum-x86_64.AppImage

License

MIT — © 2026 wleeaf.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

projectum-1.7.0.tar.gz (87.9 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

projectum-1.7.0-py3-none-any.whl (77.9 kB view details)

Uploaded Python 3

File details

Details for the file projectum-1.7.0.tar.gz.

File metadata

  • Download URL: projectum-1.7.0.tar.gz
  • Upload date:
  • Size: 87.9 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for projectum-1.7.0.tar.gz
Algorithm Hash digest
SHA256 b3f6a6a9a7b1fb0287e7ad7a33ae8382abaa66edbed393319187e1aef7443e76
MD5 15dd2f04127d5771fee64ac7fa4d42dd
BLAKE2b-256 5200d9d0f6ed1c009bb7cd5601d152e65820efa2fa0e961b5fbe5cac0bfc280e

See more details on using hashes here.

Provenance

The following attestation bundles were made for projectum-1.7.0.tar.gz:

Publisher: publish-pypi.yml on wleeaf/projectum

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file projectum-1.7.0-py3-none-any.whl.

File metadata

  • Download URL: projectum-1.7.0-py3-none-any.whl
  • Upload date:
  • Size: 77.9 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for projectum-1.7.0-py3-none-any.whl
Algorithm Hash digest
SHA256 ea5e760cc2c01e8e413c0e603e1b1a571943e68925c9c0874eff81d5c072e1da
MD5 e1eccecb38aa5fe4f2d7b273a050dcab
BLAKE2b-256 14a251811254766c978cd82c9f38b76da0f6b806739d69a665431f88a7ee4f49

See more details on using hashes here.

Provenance

The following attestation bundles were made for projectum-1.7.0-py3-none-any.whl:

Publisher: publish-pypi.yml on wleeaf/projectum

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page