TrueSight collects every tap, screen and server event into one pipeline you run, then turns it into analytics, journeys, experiments and alerts. Your agents can drive all of it from the terminal.
Open source · self-hosted · hosted beta coming soon
Acme App · Production · live data
Daily active users
63.2K▲ 8%
New users · 30d
124.6K▲ 10%
Web, iOS, Android and your backend send to one ingestion API. Each event is stored once for analysis and evaluated once against your live journeys, on infrastructure you run.
At-least-once, end to end
A queued event is cleared only after it has been processed, so a restart re-delivers instead of dropping.
Batched writes, deduplicated
Events land in bulk and collapse on their id, so a retried batch never double-counts.
Every tenant isolated by project
Each project has its own keys and its own slice of every table, from ingest to query.
Trends, funnels, retention, flows, segments and a live stream, all over the same events. Explore them in the dashboard, or ask an agent to.
Any event, any property, split and compared over time.
See the step where people give up, and who they are.
Weekly cohorts that show whether users come back.
The paths people actually take, from any starting event.
Behaviour and profile rules, sized live and summarised in plain English.
Pro-plan users who made at least three purchases in the last 30 days.
Every event as it lands, with its properties, seconds after it happens.
Build lifecycle flows on a canvas. Every user moves at their own pace, quiet hours are on by default, and each open and click is credited to the step that sent it.
A visual builder
Start a journey on an event, when someone enters a segment, or from a CSV upload.
Delays that respect each user
Wait a duration, until a time of day, or until each user's own usual time.
Quiet hours by default
Nothing lands 22:00–07:00; transactional sends can bypass it, one step at a time.
Per-user merge tags
Upload a CSV and every column becomes a tag, rendered for that recipient only.
Opens and clicks, per step
Push taps and email clicks are attributed back to the exact step that sent them.
Push and email campaigns go to the segments you already built, personalised per user, and every link knows which app store to send people to.
Your cart is still waiting
now2 items, saved for you
Back in stock: the one you viewed
2mGrab it before it goes again
Your Pro trial ends tomorrow
1hTap to review your plan
Illustrative numbers
Campaigns
One-off or scheduled sends to a segment or a list, with sent, opened and clicked for every recipient.
Subject
Hi Alex, 20% off your next order
Use WELCOME20 at checkout this week.
Email templates
Merge tags render from each user's profile at send time.
| user_id | coupon_code | plan |
|---|---|---|
| 10421 | WELCOME20 | free |
| 22917 | SAVE15 | pro |
| 33108 | WELCOME20 | free |
CSV merge tags
Every column becomes a tag for that send only; profiles stay untouched.
Deferred deep link: the install opens on the right screen.
Smart links
One link for every platform, and installs land on the screen you meant.
Upload once · WebP / AVIF on the way in
Asset library
Images live with the project, ready for every template and push.
22:00 – 07:00
on by default, per project
held until 07:00
Quiet hours
Deferred, not dropped: sends in the window wait for morning.
Feature flags and A/B tests on the same users your analytics already knows. Results update as data lands, and a guardrail breach pauses the variant before it costs you.
Ramping only adds users. Nobody already in the test is reshuffled.
Deterministic bucketing: the same user lands in the same variant on every platform.
variant = flags.get_variant( "pricing_banner", {"user_id": uid}, attributes={"plan": "pro"}, default="control",)# in-memory, no network on the request pathFlags with rules and overrides
Target by any trait, segment or id list; pin a user to a variant while you QA.
Layers and holdouts
Keep competing tests mutually exclusive and hold a slice out of everything.
Sequential stats you can peek at
Check results any day without inflating false positives.
Sample-ratio and guardrail alerts
Broken splits and hurting guardrails go straight to Slack or email.
Auto-ramp and auto-pause
Step allocation up when it's safe; pause a variant that breaches a guardrail.
Local or one decide call
Evaluate in-process on your server, or with a single request from apps and web.
Put a monitor on any metric. TrueSight learns its weekly rhythm, tells Slack or email when it breaks, and tells you again when it recovers.
Purchases · anomaly
↓ 23% below expected for a Tuesday
Wednesday · one message, then quiet
Growth board · illustrative data
Threshold, change or anomaly
Fixed limits, week-over-week moves, or a baseline learned from the same weekday and hour.
Hourly or daily
Each bucket is checked an hour after it closes, so late events are counted.
Slack or email, not a firehose
One alert when it fires, one when it recovers, with a cooldown in between.
A growth board
Pin the metrics that matter and read week-over-week change at a glance.
Ask Claude Code for last week’s funnel and it runs truesight, reads the JSON, and hands back the answer. The same CLI builds cohorts and stands up journeys, on infrastructure you own.
{ "funnel": "Signup → Upgrade",
"biggest_drop": "Invited Teammate",
"rate": "39%" }truesight funnels resultsQuery funnels, retention, cohorts, segments and events, and read structured JSON back. No screen-scraping a dashboard.
truesight journey createCreate, not just read. Agents build segments and funnels, and stand up journeys from a prompt.
--format jsonJSON by default; --format table for humans. Pipe into jq, drop into CI, hand it to an agent.
truesight skill installInstalls the /ts skill, so Claude Code, Codex and Cursor know every command with no custom wiring.
One API, init, track, identify, across web, mobile and your backend.
1import { init, track, identify } from '@cityflo/truesight-web-sdk'2 3await init({ apiKey, endpoint })4 5track('completed_purchase', { items: 2, total: 49.9 })6identify('user_8f21', { plan: 'pro' })npm install @cityflo/truesight-web-sdkBrowser apps and WebViews · ESM, CJS & UMD
Offline-first
Events queue on the device and flush in batches, so a tunnel or a dead zone loses nothing.
Encrypted at rest
The queue is encrypted on web, Android and iOS before anything leaves the device.
Auto-tracked
Sessions, screens and clicks come for free; you add the events that matter to you.
Your events never leave your infrastructure. Self-hosted, isolated per project, encrypted on the device and open source, so where the data lives and who reads it stays your decision.
Run the whole stack on your own cloud. Every project is isolated, and no event touches a third party.
The SDK queue is encrypted before it leaves the phone or the browser, on every platform.
Your cluster, your rules: how long events live and who can query them is your call.
Built with Rust, ClickHouse and PostgreSQL.
MIT-licensed and opening up soon: pipeline, SDKs and CLI, yours to read, fork and run.
The SDKs and CLI are published; the platform is being prepared for release. Join the waitlist and we’ll email you the moment your spot opens.