Thank you for considering contributing to tdlist, the advanced, portable, zero-dependency todo list manager written in pure Bash. We welcome contributions that improve the usability, portability, functionality, and robustness of this project.
- Minimalism: No required external dependencies.
- Portability: Must run anywhere Bash + coreutils are available.
- Clarity: Simple, readable, and maintainable Bash.
- Fail-Safe Design: Code must handle degraded environments gracefully.
- Extensibility: Features should be modular and easily toggleable based on system capabilities.
Refer to ROADMAP.md for a detailed breakdown of planned features, optional enhancements, and future ideas.
You can contribute by:
- Implementing core functionality (e.g., task creation, filtering, progress tracking)
- Adding support for optional tools (e.g.,
fzf,dialog,notify-send) - Improving UX (e.g., help messages, CLI flags, output formatting)
- Writing or updating documentation
- Suggesting and implementing new features
- Testing on edge-case environments (e.g., Termux, containers)
- Fixing bugs or enhancing stability
- Refactoring existing logic for performance or clarity
- Use Bash, not POSIX
/bin/sh. - Use standard coreutils (e.g.,
grep,awk,sed,cut). - Use
command -v toolto detect optional tools safely.
- All console output:
- Should be made using the
msgfunction. - Must fit within 80 columns unless its a single line.
- Can be formatted with
msg, (seemsg in tdlist)
- Should be made using the
- Unexpected errors are handled with the
errorfunction. - Use
[[ ]]for tests instead of[ ] - Consistent indentation (match existing style).
- Descriptive variable names where a variable's purpose is not obvious.
- Functions should try to be self contained with and use local variables.
- Use comments for logic blocks, conditionals and loops whose purpose is not obvious.
- Document any TODOs or BUGS within nearby comments if any.
As much as it's a challenge to document all the possible rules, it is required that you match the existing style for any rules not mentioned.
If a feature relies on an external tool, use:
if [[ -x "$(command -v dialog)]]; then
# Enable dialog ui
fiOptional features must degrade gracefully without breaking core functionality.
- Format:
key=valueper line - Multiline statements i.e descriptions must be
base64encoded to fit on one line. - All task files stored in
~/.tdlist/tasks/and other files with~./tdlist
Manual testing is expected for now.
- Try core features in different environments (minimal VM, WSL, macOS, Termux)
- Validate features without relying on external tools
- Confirm task parsing, listing, and editing works with edge-case inputs (empty fields, multiline descriptions, missing keys)
Automated test suite may be added in future milestones.
-
Fork the repository
-
Short branch name in context with improvements.
-
Make changes with clear, logical commits
-
Push and open a pull request:
- Describe what was added/changed
- Mention any optional tools or system dependencies added
- Reference any related issues or roadmap items
Pull Requests must not break core functionality in a minimal Bash-only system.
By contributing, you agree that your work will be released under the LICENSE.
Open an issue to ask questions, suggest improvements, or get clarification on implementation ideas.
Thanks for helping make tdlist a reliable tool for terminal productivity across all environments.