Building the product

The tools we built to build DataTug.

You should be able to trust the software you use to understand your data. For us, that trust starts with how we build: on proven open-source foundations, with explicit contracts, reviewable changes, and evidence that a feature reached the product. The tools we created for that work are open for other developers too.

For developers

Watercolor of developers building a tugboat together in a shipyard on solid stone foundations.
Built with care, on foundations laid by others.

Trust is built during development

Suppose we want DataTug to let a developer attach a shared meaning to a query result column. That small sentence crosses the query editor, a saved project definition, typed result metadata, a semantic registry, a local service, and a hosted service. It is a useful example because the engineering problem is familiar: each part is reasonable on its own, but the contract between them can disappear into tickets, chat, and memory.

Our starting point is not a new platform for every problem. Git gives us history and review. Markdown keeps decisions readable. Go and TypeScript let us build practical services and interfaces. SQLite gives local tools a dependable store. We add our own formats and tools when a connection between those foundations needs to be explicit, portable, and testable.

1. SpecifyWhat must work? SpecScore makes acceptance criteria reviewable.
2. ExploreWhere does it live? CodeGrapher maps the affected code.
3. DesignWhat are the contracts? ModelSpec, MeaningGraph, and TugQL define them.
4. DeliverHow do we build and prove it? DALgo, storage tools, Chatwright, and WB support the work.
Conceptual development flow. These projects have separate responsibilities; the diagram does not imply every planned integration is live.

Turn the request into a checkable promise

“Let people add meanings to columns” is an idea, not yet a build contract. Which columns are eligible? What happens if the result shape changes? Does an unconfirmed mapping look valid? SpecScore is our open format and methodology for recording features, requirements, acceptance criteria, plans, and tasks as Markdown in Git. Its CLI checks structure and references, so the decision can travel with the implementation and survive an agent handoff.

Watercolor of two developers reviewing a tugboat blueprint beside a laptop, a model boat, and a rubber duck.
SpecScore. A shared blueprint, a careful review, and a rubber duck with excellent listening skills.
In this feature

An acceptance criterion can state that a mapping awaiting validation has a neutral status, while a confirmed fingerprint mismatch needs review. A test and a reviewer can then check the same promise. Git and Markdown remain the foundation; SpecScore adds a traceable, lintable bridge from intent to code.

Find the implementation seam before editing

Now the developer needs to discover where result columns are constructed, where saved queries are written, and which screens consume them. Search is a great first step, but matching a symbol name does not show its callers or the path from a route to a database write. CodeGrapher indexes files, symbols, and relationships into a local SQLite graph that people and agents can query.

In this feature

Trace the result-column type from the executor into the browser grid, then find the save path and the code that reads it back. The graph makes an impact review faster and makes omissions easier to spot. Our Go port builds on Colby McHenry's codegraph and uses a patched fork of Oscar Villavicencio's gotreesitter. That lineage is an example of taking useful open work further and publishing our changes.

Watercolor of a developer tracing connected harbor routes on a navigation chart.
CodeGrapher. Trace the route through the code before changing course.

Make the data contracts say what they mean

A result column has a structural type and a business meaning. They are related, but they are not interchangeable. ModelSpec describes record types, fields, keys, and references independently of one database, language, or API framework. MeaningGraph defines reusable concepts with versioned addresses and lets a dataset bind its fields to them. DataTug owns the binding between a particular query result and those definitions.

In this feature

The result field may be a decimal in the model while its meaning is “invoice total” in a shared concept graph. A calculated result can be mapped at query-result scope without pretending it came from a physical source column. We created separate standards because SQL DDL or generated types can describe shape but cannot settle semantic identity; a glossary can describe meaning but cannot validate a field's type or key.

Keep the query definition portable

Changing metadata on a saved query should not lock the feature to a single SQL dialect or make the browser and CLI maintain different query models. TugQL is the open query language we are developing for relational, document, API, and graph-connected sources. Its structured tree, TugQT, gives editors and agents a common representation to inspect and transform. Older DataTug libraries and documents still use the former name DTQL.

In this feature

A saved query can keep its readable text while a mapping refers to its output field and the definition revision. We built a portable query contract because raw SQL is tied to a provider and a visual builder's private JSON would be hard to review in Git. Provider-specific execution remains the job of an adapter, with its limits made explicit.

Watercolor of a captain plotting a route between harbor terminals with a branching navigation stencil.
TugQL and TugQT. A portable route, with a structure editors and agents can inspect.

Implement once, choose storage deliberately

The feature needs to save and read data in several settings. DALgo gives Go code a shared API for records, queries, transactions, and access policies across adapters. It does not erase provider differences: an adapter reports a capability it cannot support. We built DALgo because wiring business rules directly to Firestore, SQL, or a test store would duplicate the same logic and make backend changes expensive.

Some definitions should live in the project repository. inGitDB treats structured records as schema-validated files in Git, so a change can be diffed and reviewed with code. We made it because an operational database is excellent at serving requests but does not naturally make each definition a branchable, human-readable pull request.

Private operational state needs another boundary. OpenVaultDB gives databases an identity and mounted engines under a common contract. DataTug is building its session storage on that boundary with local SQLite and hosted Firestore profiles. Its broader user-owned vault and grants vision is still evolving. The session storage article has the detailed architecture and current limits.

Three responsibilities

DALgo is the application code's data access seam. inGitDB is for structured content that belongs in version control. OpenVaultDB is the database and ownership boundary for application state. They compose where useful, but none is a rename of another.

Test the conversation a developer actually has

A conversational feature needs checks across several turns: what the user sends, what the application replies, and what happens after the next action. Chatwright is our open-source tool for developing and testing conversational applications. It emulates messaging-platform APIs, drives the real application through HTTP, and records interactions in a run bundle developers can inspect in a player.

We created it because a unit test around a reply function leaves out webhook delivery, button actions, message edits, and the sequence a user experiences. Established messaging APIs and Go's testing tools provide the foundations. Chatwright adds repeatable conversation scenarios and evidence at that boundary, so we can investigate a failure without manually repeating the conversation on a live messaging service.

A small, runnable example

Chatwright's greeting bot receives /start, offers language buttons, and edits its reply when a user selects another language. The test checks the interaction through the emulated platform. Its runtime also has an agent CLI example that asks an agent to remember a word, then checks recall on the next turn. That is the kind of continuity a conversational data tool must get right before a longer workflow can be trusted.

For DataTug, the proposed integration would let developers inspect captured data assertions and query results in its workspace. That handoff remains design work. Chatwright's public examples already let developers exercise the conversation-testing mechanism independently.

Watercolor of a tugboat captain speaking into a maritime radio beside a logbook and empty speech bubbles.
Chatwright. Check both sides of the conversation—and the next turn.

Prove the change reached the product

A passing unit test in one checkout is useful evidence, but this feature can cross the DataTug app, CLI, query library, and registry. WB, the Sneat Dev Workbench, coordinates repository work: it creates isolated worktrees, runs repeatable checks, helps land compatible changes, and records which exact remote target received them. Review, CI, and deployment checks remain separate steps. That distinction matters when someone asks whether a feature is actually available.

In this feature

The developer can validate the changed query and mapping behavior, review the site copy against what actually works, and land each repository with its own CI receipt. WB adds a verifiable lifecycle around Git and CI, so a local green test is never mistaken for a remote release.

Watercolor of separate tugboat builds being inspected before converging on a finished boat ready to launch.
WB — Sneat Dev Workbench. Separate workspaces, coordinated review, a verified landing.

Built on open source. Shared back as open source.

Watercolor of a developer sharing a toolbox and blueprints with another builder while a harbor community works on tugboats.
A good tool should help the next crew build, too.

Each new tool is maintenance work, so we build only where a shared contract is missing: a specification to lint, a code path to trace, a model to reuse, a meaning to pin, a query to move, or a change to land with evidence. We publish the formats and reference implementations with their source, examples, and limitations. Other teams can inspect the decisions, use a tool independently of DataTug, file an issue, or build a different implementation of an open format.

Some parts are in routine use and others, especially the wider semantic registry and user-owned vault experience, are still under development. We say which is which because a clean specification, a merged library, and a deployed product are different kinds of evidence. For developers evaluating DataTug, that is the promise behind this article: our process should make the software understandable, its claims checkable, and its building blocks useful beyond our own product.