Skip to content

Architecture

Thogits has three core concepts:

Thogits

A thogit is an entry — an ID, a name, and an optional description. On its own it carries no structured data. Structure comes from tags.

Tags

Tags are not labels — they are schemas. Each tag defines a set of typed fields (String, Number, Date, Select, Reference, etc.). Applying a tag to a thogit gives it those fields.

Field Values

When a tag is applied, its field values are stored as JSON keyed by tag ID. Each tag’s data also tracks the schema version at the time it was applied.

┌──────────────────────────────────────────────────────────────┐
│ Thogit │
│ ├── id: ULID │
│ ├── name: String │
│ ├── description: String (optional) │
│ └── data: Map<TagId, TagData> │
│ └── TagData │
│ ├── field_values: Map<String, JSON> │
│ └── schema_version: u64 │
├──────────────────────────────────────────────────────────────┤
│ Tag │
│ ├── tag_id: ULID │
│ ├── name: String (unique) │
│ ├── description: String (optional) │
│ ├── fields: Map<String, Schema> │
│ └── schema_version: u64 │
└──────────────────────────────────────────────────────────────┘

A single thogit can have any combination of tags. There is no fixed type hierarchy.

{
"id": "01JQX...",
"name": "Fix login timeout bug",
"description": "Session expires after 5 minutes instead of 30",
"data": {
"01JQA...": {
"field_values": { "status": { "variant": "InProgress" }, "priority": ["High"] },
"schema_version": 3
},
"01JQB...": {
"field_values": { "assignee": "01JQC...", "due_date": "2025-04-15" },
"schema_version": 1
}
}
}

Here one thogit has two tags applied — perhaps “Task” and “Assignment” — each contributing their own fields. Remove a tag, and its fields disappear. Add a new tag, and the thogit gains new fields.

Tags track a schema_version that increments whenever their fields change. When a tag is applied to a thogit, the TagData records the version at that point. This makes it possible to detect when a thogit’s tag data was written against an older schema.

Traditional knowledge tools force you to choose a structure upfront. Thogits inverts that:

  • No rigid types. A thogit is whatever its tags say it is.
  • Composable metadata. Need a “Book” that is also a “Project”? Apply both tags.
  • Schema evolution. Change a tag’s fields without migrating existing data. Versioning tracks the drift.
  • Powerful filtering. The flat field-value storage enables a composable filter DSL that queries across any tag’s fields.