Types and Inheritance
Bowerbird uses strict type inheritance to reduce duplication and ensure consistency.
Type Hierarchy
Section titled “Type Hierarchy”Types form a single-inheritance tree. Every type extends exactly one parent, and all types ultimately inherit from meta:
meta (global fields)├── reflection│ ├── daily-note│ └── idea├── objective│ ├── task│ └── milestone└── entity ├── person └── placeDefining Types
Section titled “Defining Types”Types are defined with the extends property linking to their parent:
{ "types": { "meta": { "fields": { "status": { "prompt": "select", "options": ["raw", "active", "done"] }, "created": { "value": "$NOW" } } }, "objective": { "fields": { "deadline": { "prompt": "date" } } }, "task": { "extends": "objective", "fields": { "priority": { "prompt": "select", "options": ["low", "medium", "high"] } } } }}A task note gets:
statusandcreatedfrommetadeadlinefromobjectivepriorityfrom itself
Inheritance Rules
Section titled “Inheritance Rules”- Single inheritance — Each type has exactly one parent
- Unique names — Type names must be unique across the entire schema
- No cycles — A type cannot extend its own descendant
- Override defaults only — Child types can override
defaultvalues, but not field structure
Field Types
Section titled “Field Types”Fields define what data each note type collects:
- Static — Fixed value:
{ "value": "$NOW" } - Text — Free input:
{ "prompt": "text" } - Select — Choose from options:
{ "prompt": "select", "options": [...] } - Relation — Link to other notes:
{ "prompt": "relation", "source": "milestone" } - Number, Boolean, Date, List — Other prompt types
Next Steps
Section titled “Next Steps”- Schema Reference — Complete property reference
- Migrations — Evolving your type system