#note-taking #productivity #cli-productivity #cli #notes

app bloodtree

A hierarchical note-taking system with focus on relationships between nodes

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

AGPL-3.0-or-later

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

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:

  1. example.org (child of node with ID 1)
  2. path (child of example.org)
  3. to (child of path)
  4. api (child of to)
  5. 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