Haul

Inventory management,
your way.

Haul is an open-source system for tracking assets, describing them with labels, grouping them into relations, and observing every mutation through an automatic event log.

Go PostgreSQL GNU GPL v2 pre-v1
View on Codeberg Follow development

Core entities

These operations are available today through the PostgresClient — the database client that the upcoming API server and API client will expose over HTTP.

Assets

The named items you track. Each asset gets a UUID on creation.

List Get Create Delete UpdateName

Labels

Key-value metadata attached to assets, relations, or templates. Optionally typed by a Kind.

List Get Create Delete UpdateName UpdateKind UnsetKind

Kinds

Typed constraints for label values. Each Kind carries a regex that values must satisfy.

List Get Create Delete UpdateName UpdateRegex

Relations

Named groupings of assets, each asset participating with an explicit Purpose.

List Get Create Delete UpdateName

Templates

Reusable label sets that can be stamped onto assets at once.

List Get Create Delete UpdateName

Purposes

Roles an asset plays within a relation (e.g. "source", "destination").

List Get Create Delete UpdateName

Events

Immutable log entries generated automatically by database triggers on every mutation.

List Get read-only

Associations

Entities are connected through typed join tables. Each association can carry a value and be assigned, unassigned, or updated independently.

Asset ↔ Label

Attach a label with a value to any asset.

List Get Assign Unassign UpdateValue

Asset ↔ Template ↔ Label

Track which label value was applied to an asset through a specific template.

List Get Assign Unassign UpdateValue

Relation ↔ Asset

Add an asset to a relation under a specific purpose.

List Get Assign Unassign GetPurpose

Relation ↔ Label

Attach metadata directly to a relation.

List Get Assign Unassign UpdateValue

Template ↔ Label

Define the labels (with default values) that make up a template.

List Get Assign Unassign UpdateValue

Cross-cutting features

Behaviour that applies across the full data model.

Automatic event log. Every mutation — creation, deletion, name update, label assignment, value change — emits an event row through a PostgreSQL trigger. No application code needed.
Regex-validated label values. Bind a Kind (with a regex) to a Label. Updating that binding triggers retroactive validation of all existing values on the label.
Filtered, paginated lists. Every List operation accepts a regex filter string alongside limit and offset, applied server-side.
Transactional writes. All mutations run inside a PostgreSQL transaction. Batch creates and deletes are atomic.

Implementation status

The database client is the reference implementation. The API server and API client will surface the same operations over HTTP.

DB client
Available
API server
In progress
API client
In progress
CLI
In progress
UI server
In progress
v1 release
Planned