A lightweight CLI tool for capturing quick notes and managing todos with project-based organization.
brew tap nathan-nicholson/tap
brew install notego install github.com/nathan-nicholson/note@latestDownload the latest release for your platform from the Releases page.
Available for:
- Linux (amd64, arm64)
- macOS (Intel, Apple Silicon)
- Windows (amd64)
git clone https://github.com/nathan-nicholson/note.git
cd note
make build
./note --helpnote "Quick thought"
note todo "Task to complete" --due tomorrow
note project work- Quick note capture - Instantly save thoughts from the terminal
- Todo management - Track tasks with due dates and completion status
- Project-based organization - Group work by projects with automatic tagging
- Activity logging - Automatic notes for todo and project lifecycle events
- Flexible tagging - Tag notes and todos for easy filtering
- Date-based filtering - Find notes by date range
- Local timezone support - All timestamps use your local timezone
Create a note:
note "Meeting with team at 2pm"
note "Important decision" --important --tag architectureList notes:
note list # Today's notes
note list --start 2025-11-20 # From Nov 20 to today
note list --start 2025-11-20 --end 2025-11-22
note list --tag work --important # Filter by tags and importance
note list --show-ids # Show IDs for editingEdit and manage:
note edit 42 --content "Updated content"
note edit 42 --tag newTag
note show 42
note delete 42Create todos:
note todo "Review PR"
note todo "File taxes" --due 2025-12-31 --tag finance
note todo "Weekly report" --due tomorrowList todos:
note todo list # All todos grouped by status
note todo list --incomplete # Only incomplete
note todo list --tag work # Filter by tagManage todos:
note todo complete 42
note todo uncomplete 42
note todo edit 42 --content "Updated task" --due next-week
note todo show 42
note todo delete 42Create and switch projects:
note project create work --tag professional
note project work # Switch to work projectList projects:
note project list # Open projects only
note project list --all # Include closed projectsProject status:
note project status # Current project
note project status work # Specific project
note project status --all # Show all tasks including completedClose and manage:
note project close work # Close project (all todos must be complete)
note project reopen work # Reopen a closed project
note project edit work --tag professional --tag fulltime
note project show work
note project delete old-projectList all tags with usage counts:
note tagsCheck current version:
note versionCheck for updates:
note update --check # Check for updates only
note update # Check and prompt to install
note update -y # Check and install without promptThe update command will:
- Check for the latest version on GitHub
- Show release notes for the new version
- Detect your installation method (Homebrew, go install, or binary)
- Automatically update if possible (Homebrew/go install)
- Provide download instructions for manual installs
Natural language:
todaytomorrowend-of-week(next Friday)end-of-monthnext-week(7 days from today)next-month
ISO format:
2025-11-252025-12-31
All data is stored in ~/.note/notes.db using SQLite.
When a project is active, all new notes and todos are automatically tagged with the project name:
note project work
note "Sprint planning complete"
# Automatically tagged: #work
note todo "Deploy to production" --due friday
# Automatically tagged: #workThe tool automatically creates notes for important events:
Todo activities:
- Created todo
- Updated todo
- Completed todo
- Deleted todo
Project activities:
- Created project
- Activated project
- Deactivated project
- Updated project
- Closed project
- Reopened project
- Deleted project
These notes appear in your regular note list and can be filtered using tags like #todo, #project, #complete, etc.
make build # Build the binary
make install # Install to $GOPATH/bin
make test # Run tests
make test-verbose # Run tests with verbose output
make test-coverage # Generate HTML coverage report
make clean # Remove build artifactsThe project has comprehensive unit and integration tests:
# Run all tests
go test ./...
# Run tests with coverage
make test-coverage
# Run specific package tests
go test ./internal/dateparse/...
go test ./internal/repository/...Current test coverage:
- Date parser: 95.2%
- Repository layer: 47.5%
This project uses GitHub Actions for continuous integration and automated releases.
On every push and pull request to main:
- Tests run on Go 1.22, 1.23, and 1.24
- Code is built and verified
- Linting checks are performed
- Coverage reports are generated
This project uses release-please for automated releases:
- Commit with Conventional Commits - Use conventional commit messages (see below)
- Release PR Created - Release-please creates/updates a release PR
- Merge Release PR - When merged, a new release is created automatically
- Binaries Built - Cross-platform binaries are built and attached to the release
Use conventional commit format for your commits:
# Features
git commit -m "feat: add support for recurring todos"
git commit -m "feat(projects): add project archiving"
# Bug fixes
git commit -m "fix: correct date parsing for leap years"
git commit -m "fix(database): handle connection timeout"
# Documentation
git commit -m "docs: update installation instructions"
# Tests
git commit -m "test: add integration tests for projects"
# Performance improvements
git commit -m "perf: optimize note listing query"
# Refactoring
git commit -m "refactor: simplify tag management logic"
# CI/Build changes
git commit -m "ci: add code coverage reporting"
git commit -m "build: update dependencies"Types:
feat: New feature (triggers minor version bump)fix: Bug fix (triggers patch version bump)docs: Documentation changestest: Adding or updating testsperf: Performance improvementsrefactor: Code refactoringbuild: Build system or dependency changesci: CI/CD configuration changeschore: Other changes that don't modify src or test files
Breaking Changes:
For breaking changes, add ! after the type or add BREAKING CHANGE: in the footer:
git commit -m "feat!: remove deprecated todo filters"
# Or with footer
git commit -m "feat: redesign project API
BREAKING CHANGE: Project API now uses new schema"When a release is created using release-please and GoReleaser:
- Binaries are built for Linux (amd64, arm64), macOS (Intel, Apple Silicon), and Windows (amd64)
- Homebrew formula is automatically updated in nathan-nicholson/homebrew-tap
- Checksums are generated for all artifacts
- Release notes are automatically generated from commits
Download the latest release from the Releases page.
Setting up Homebrew publishing: See HOMEBREW_SETUP.md for detailed instructions.
- Fork the repository
- Create a feature branch (
git checkout -b feat/amazing-feature) - Commit your changes using conventional commits
- Push to your branch (
git push origin feat/amazing-feature) - Open a Pull Request
All PRs must:
- Pass CI checks (tests, linting)
- Include tests for new functionality
- Follow conventional commit format
- Update documentation as needed
MIT