A CLI todo list that renders as your desktop wallpaper
Project description
Todo-Wallpaper
A simple interactive todo list that appears as your Linux desktop wallpaper.
Features
- 📝 Manage todos via simple CLI commands
- 🖼️ Live wallpaper rendering with minimalist design
- 🚀 Automatic startup on login (via systemd)
- 🎨 Clean, readable formatting with blue accent
Architecture
todo-wallpaper/
├── todos.json # Todo storage (JSON)
├── render.py # Wallpaper renderer (Pillow)
├── todo.py # CLI interface
├── todo # Shell wrapper for the global command
├── watch.py # File watcher (optional daemon)
├── init.py # One-command setup
└── wallpaper.png # Generated wallpaper
Installation
Prerequisites
Ensure you have Python 3 installed:
python3 --version # Should be 3.7+
Quick Setup (One Command)
cd ~/projects/random/todo-wallpaper
python3 init.py
This will:
- ✓ Check and install Python dependencies (Pillow, watchdog)
- ✓ Verify system tools (feh, fonts)
- ✓ Generate your first wallpaper
- ✓ Install the
todocommand into~/.local/bin - ✓ Enable automatic startup on login via systemd
Install via pip (recommended)
Install from PyPI with pip:
pip install todo-wallpaper
After install, run the packaged setup step to enable autostart and install the command wrapper:
todo init
Install via Homebrew (macOS / Linuxbrew)
You can create a Homebrew tap or formula that installs the package; we recommend using the PyPI wheel in the formula. Example (once tap exists):
brew install Yash-Thio/tap/todo-wallpaper
Convenience installer (curl|bash)
If you prefer a single-line installer, you can use the hosted install.sh which wraps a pip install:
curl -sSL https://raw.githubusercontent.com/Yash-Thio/todo-wallpaper/main/install.sh | bash
This script is a thin convenience wrapper around pip install. It supports --dry-run and --system flags.
Manual Setup (advanced)
If you prefer to set up manually from source:
# Install dependencies
pip install Pillow watchdog
# Install system tools
sudo apt install feh fonts-dejavu
# Generate initial wallpaper
python3 render.py
# Make sure ~/.local/bin is on PATH
echo 'export PATH="$HOME/.local/bin:$PATH"' >> ~/.zshrc
source ~/.zshrc
# Enable autostart (Linux systemd)
mkdir -p ~/.config/systemd/user
cp todo-wallpaper-init.service ~/.config/systemd/user/
systemctl --user daemon-reload
systemctl --user enable todo-wallpaper-init.service
Usage
Adding Todos
todo add "Buy groceries"
todo add "Complete project"
The wallpaper will automatically render and update your desktop.
Listing Todos
todo list
Output:
1: Buy groceries
2: Complete project
Removing Todos
todo remove 1 # Remove first todo
todo remove 2 # Remove second todo
Get Help
todo
Set Up Autostart
todo init
Publishing
Follow these steps to publish releases to PyPI and to test uploads with Test PyPI.
-
Create a PyPI account if you don't have one: https://pypi.org/account/register/
-
Create an API token (recommended) instead of a password:
- Go to https://pypi.org/manage/account/token/
- Create a new token scoped to "Upload packages" and give it a descriptive name.
- Copy the token value once — you won't be able to see it again.
-
Add the token to your GitHub repository as a secret named
PYPI_API_TOKEN:- Repository → Settings → Secrets and variables → Actions → New repository secret
- Name:
PYPI_API_TOKEN - Value: the token you copied from PyPI
-
Test locally with Test PyPI (optional):
python3 -m pip install --upgrade build twine
python3 -m build
python3 -m twine upload --repository testpypi dist/*
# Install from Test PyPI to verify the package
python3 -m pip install --index-url https://test.pypi.org/simple/ --no-deps todo-wallpaper
- Publish via GitHub Actions (automated):
- Tag a release and push the tag to GitHub:
git tag v0.1.0
git push origin v0.1.0
- The CI workflow
.github/workflows/publish.ymlwill build the distributions, run a smoke import test, publish to PyPI usingPYPI_API_TOKEN, and create a GitHub Release.
Notes
- Keep
PYPI_API_TOKENsecret — treat it like a password. - If you want to test the whole CI flow against Test PyPI, you'll need to adjust the publish action to point at Test PyPI or perform a manual
twine uploadas shown above.
This enables automatic wallpaper rendering on login via systemd.
Workflow Examples
Daily Routine
# Start your day
todo add "Review emails"
todo add "Team standup"
todo add "Code review"
# Check what's on your plate
todo list
# Mark items as done
todo remove 1 # ✓ emails done
todo remove 1 # ✓ standup done
Batch Operations
Add multiple tasks:
for task in "Fix bug" "Write docs" "Deploy"; do
todo add "$task"
done
Files Explained
| File | Purpose |
|---|---|
todos.json |
JSON file storing your todo list |
render.py |
Generates wallpaper PNG from todos.json |
todo.py |
CLI tool to add/remove/list todos |
todo |
Shell wrapper for the todo command |
| init.py | One-command installation + autostart setup |
| wallpaper.png | Generated wallpaper image |
Customization
Colors
Edit render.py:
BACKGROUND = (20, 20, 30) # Dark blue-gray
TEXT = (240, 240, 240) # Light white
ACCENT = (120, 200, 255) # Light blue
Font Size
Edit render.py:
title_font = ImageFont.truetype(..., 54) # Title (TODO)
font = ImageFont.truetype(..., 36) # Items
Wallpaper Dimensions
Edit render.py:
WIDTH = 1920
HEIGHT = 1080
Font Path
If you have a different font installed, update render.py:
font = ImageFont.truetype("/path/to/font.ttf", 36)
Find available fonts on Linux:
fc-list | grep -i "font-name"
Troubleshooting
Dependencies missing after todo init
If you see errors about missing tools, install the required system packages:
sudo apt install feh fonts-dejavu
Then run todo init again.
"Font not found"
Ensure fonts-dejavu is installed:
sudo apt install fonts-dejavu
# Or check available fonts:
fc-list | head -20
"Pillow not found"
pip install Pillow
Wallpaper not updating on startup
Check systemd service status:
systemctl --user status todo-wallpaper-init.service
journalctl --user -u todo-wallpaper-init.service -n 20
Want to stop autostart?
systemctl --user disable todo-wallpaper-init.service
Re-enable autostart?
systemctl --user enable todo-wallpaper-init.service
Manual wallpaper render
python3 render.py
Optional: File Watcher
Use watch.py to auto-update wallpaper whenever todos.json changes:
python3 watch.py
This runs a daemon in the foreground. Press Ctrl+C to stop.
Requirements: watchdog package (pip install watchdog)
Tips
-
Keybinding: Create a shell alias for faster access:
alias todo='python3 ~/projects/random/todo-wallpaper/todo.py' # Now use: todo add "task name"
-
Full-screen todo view: List all todos in a terminal:
watch -n 1 'python3 ~/projects/random/todo-wallpaper/todo.py list'
-
Regular refresh (if not using watch.py):
# Add to crontab to refresh every hour 0 * * * * python3 ~/projects/random/todo-wallpaper/render.py
Development
Testing
# Add a test todo
python3 todo.py add "Test task"
# Verify it appears in wallpaper
python3 render.py
# List todos
todo list
# Remove it
todo remove 1
Project Structure
- State: todos.json (persistent JSON file)
- Rendering: render.py (Pillow image generation)
- Interface: todo.py (CLI commands)
- Automation: init.py + systemd service (startup)
License
MIT (or your preferred license)
Support
Issues or suggestions? Check:
- Are all dependencies installed? Run
python3 setup.py - Is feh correctly setting the wallpaper? Try manually:
feh --bg-fill wallpaper.png - Are todo files in the right location? Should be in
~/projects/random/todo-wallpaper/
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
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file todo_wallpaper-0.1.0.tar.gz.
File metadata
- Download URL: todo_wallpaper-0.1.0.tar.gz
- Upload date:
- Size: 13.5 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.10.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
f9b783f9c15e4fdd78acc165fe730439fa6410dfcd210d59e507dfbd565afa7e
|
|
| MD5 |
9a478d1d2ecd27825c4355cca1143763
|
|
| BLAKE2b-256 |
a1ca79d6f31d57e244983bab4056cbc425ea9a254f3e22e2ef978e1bd960e868
|
File details
Details for the file todo_wallpaper-0.1.0-py3-none-any.whl.
File metadata
- Download URL: todo_wallpaper-0.1.0-py3-none-any.whl
- Upload date:
- Size: 11.2 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.10.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
1bee6228f80ec848683a9ac80501a2daeedb55c1ca3790bb8810c7b4a794daf3
|
|
| MD5 |
082976f53ae6f09a2af645e2653f3e42
|
|
| BLAKE2b-256 |
a79ea618f94fda76d7385bd4911cf6bf0581230ce2b7084595adcc314b065569
|