| Crates.io | bloodtree |
| lib.rs | bloodtree |
| version | 0.7.1 |
| created_at | 2025-08-01 18:17:17.049441+00 |
| updated_at | 2025-08-09 14:53:50.705375+00 |
| description | A hierarchical note-taking system with focus on relationships between nodes |
| homepage | https://github.com/amrosia/bloodtree |
| repository | https://github.com/amrosia/bloodtree |
| max_upload_size | |
| id | 1777258 |
| size | 148,793 |
A hierarchical note-taking system with focus on relationships between nodes.
cargo install bloodtree
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"
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 specific node
bt view 2
# View entire vault
bt view all
# View specific node
bt viewtree 2
# View entire vault
bt viewtree all
`
Opens node in your default editor, specify your editor with $EDITOR environment variable:
bt edit 2
Fuzzy search across node names and fields:
bt search "design homepage"
Each node has:
Fields are free-form text that can be used for:
Nodes are stored in plain text using pipe-separated values:
<timestamp>|<id>|<parent_id>|<child_ids>|<display_name>|<fields>
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'
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
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:
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'
AGPL-3.0-or-later