Time series that
fit in memory.
A columnar store for metrics that stays under a gigabyte for a year of data and answers most queries in under ten milliseconds. No server to run.
Why it exists
Three problems with the
usual answer.
Most dashboards read a handful of series. Running a cluster to serve them costs more than the dashboard is worth.
Aggregating in the browser is fine until the array is a million long. Tideline keeps the shape and drops the rest.
The whole store is one file. Copy it, open it somewhere else, and it is the same store.
API
Four calls do everything.
// open a store, create it if it is not there const store = await open('./metrics.tide') // write, one point or many await store.put('revenue.daily', { at: Date.now(), value: 48200 }) // read a window, already aggregated const weeks = await store.read('revenue.daily', { from: '2027-01-01', bucket: 'week', agg: 'sum' }) // close and flush await store.close()
Contributing
Good first issues, honestly labelled.
Eleven open issues tagged docs. Most are one paragraph and a code sample.
Postgres and DuckDB readers exist. ClickHouse and SQLite are asked for and unclaimed.
The suite runs on one machine. Results from other hardware are welcome and rarely submitted.
Every pull request gets a first reply within two working days, even if the reply is no.
Install and read a series in four lines.
MIT licensed, no telemetry, no account.
Get startedSample project page. The project and the figures are invented.
Single HTML file with no build step. Type: Inter Tight, JetBrains Mono, served by Google Fonts under the SIL Open Font License.