7 releases (breaking)
Uses new Rust 2024
| 0.7.1 | Aug 9, 2025 |
|---|---|
| 0.7.0 | Aug 9, 2025 |
| 0.6.0 | Aug 9, 2025 |
| 0.5.0 | Aug 3, 2025 |
| 0.2.0 | Aug 1, 2025 |
#263 in Text processing
70KB
1.5K
SLoC
Bloodtree
A hierarchical note-taking system with focus on relationships between nodes.
Features
- 🌲 Hierarchical node structure with parent-child relationships
- 📝 Free-form fields for flexible data storage
- 🔍 Fuzzy search across node names and fields
- 🎨 Color-coded interface for better readability
- 📑 Interactive node editing
- 🔎 Greppable plain text format for easy scripting
Installation
cargo install bloodtree
Quick Start
Create a Vault
A vault is where your nodes live. It's a single file with .bt extension:
# Create new vault "work.bt" with root node
bt new -v work.bt -n "Work"
Add Nodes
Nodes can store any information and link to other nodes:
# Add a project node (child of root)
bt new -n "Website Project" -p 1 "deadline:2024-03" "status:active"
# Add a task node
bt new -n "Design Homepage" -p 2 "#design" "priority:high" "needs review"
View Nodes
# View specific node
bt view 2
# View entire vault
bt view all
View Nodes as Trees
# View specific node
bt viewtree 2
# View entire vault
bt viewtree all
`
Edit Nodes
Opens node in your default editor, specify your editor with $EDITOR environment variable:
bt edit 2
Search
Fuzzy search across node names and fields:
bt search "design homepage"
Node Structure
Each node has:
- Unique ID
- Timestamp
- Display name
- Optional parent
- Optional children
- Custom fields
Fields
Fields are free-form text that can be used for:
- Simple notes: "Check this later"
- Key-value pairs: "priority:high"
- Tags: "#todo #important"
- URLs: "https://example.com"
- References: "@meeting @project"
File Format
Nodes are stored in plain text using pipe-separated values:
<timestamp>|<id>|<parent_id>|<child_ids>|<display_name>|<fields>
Pro Tips
Speed Aliases
Every command has a one-letter alias for faster typing:
bt n -n "Quick Note" # same as 'new'
bt v 1 # same as 'view'
bt e 2 # same as 'edit'
bt s todo # same as 'search'
bt d 3 # same as 'delete'
bt vt 4 # same as 'viewtree'
Smart Defaults
-
When only one .bt vault exists in current directory, no need to specify
-v:bt new -n "Quick Note" # automatically uses the only vault present -
View command has smart defaults:
bt view # shows all nodes (same as 'bt view all') bt v # same as above
Advanced Features
Hierarchical chains
Create nested node structures in a single command using / as a separator. This is very useful for web application penetration testing where you need to map API endpoints.
# Map an API endpoint with vulnerability notes
bt new -n "example.org/path/to/api/v2" -p 1 "This endpoint is interesting because it lacks sanitization of input" "Other info"
This creates 5 nodes in sequence:
- example.org (child of node with ID 1)
- path (child of example.org)
- to (child of path)
- api (child of to)
- v2 (child of api, with the specified field(s))
Then, suppose you want to add another endpoint, which is example.org/path/to/api/legacy/v1, then the part that deviates from the created endpoit is legacy/v1. Therefore, to add your endpoint, specify the closest endpoint as parent, in this case it's api (suppose its id is 4 here).
bt new -n legacy/v1 -p 4 "Forgotten endpoint #important"
You can combine it with search by tagging your notes with literally anything you are comfortable with, and then find what you need with fuzzy search:
bt search '#important'
License
AGPL-3.0-or-later
Dependencies
~10–25MB
~318K SLoC