External Data Is Just Another Source
There's a conventional division in business software between "your data" and "external data." Your data lives in the application's database. External data lives somewhere else — in another service, behind an API, in a third-party platform. The two are fundamentally different things that require different handling.
We rejected that division. In Swifty, external data is just another data source.
The Problem with the Conventional Model
When internal and external data are treated as fundamentally different, building views that combine them is hard. An internal record with supplementary data from an external service requires custom integration code — a controller that fetches from both sources, merges the results, and passes them to a template that understands the composite shape.
This is standard practice in application development, and it's a tax on every dashboard or view that needs to show data from more than one place. The tax is paid in development time every time the requirement arises.
The Abstraction We Chose
We defined a single interface for all data sources: given configuration and optional filters, return structured items. We then implemented that interface for every source type we support: the application database, external API integrations, monitoring endpoints, static lists, and computed combinations.
Every data source, regardless of its origin, returns data in the same shape. Components consume data sources through that single interface. A table component doesn't know if the data source it's connected to is a database query or an API response. Neither does a chart component, a metrics card, or a filter component.
The components aren't aware of source origin. They're aware of data shape. And because every source returns the same shape, any component works with any source.
What This Enables
The practical consequences are significant:
A dashboard can show monitoring metrics alongside your application's records in the same panel, with the same components, without custom integration code for the combination.
A list of customer records can be enriched with data from an external service — the enriched data appears in standard column format, sortable and filterable like any internal field.
A chart on a dashboard can switch between showing internal data and external data by changing the data source configuration — the chart component stays the same.
The Cost
Building the abstraction layer requires upfront investment. Every new source type needs to implement the interface correctly. The interface itself must be stable — if it changes, everything that implements it changes too. We made that investment because we believed the payoff would be worth it.
The payoff has been real. Every time we add a new external data integration, it becomes immediately usable with every existing component. No custom glue code for each new combination. The abstraction multiplies the value of each addition.
Internal data and external data are different in origin, but they're the same in the interface. That's the decision that makes composable dashboards possible.