Seline's tech stack
Developing a simple analytics tool might seem like an easy task that could be done over a weekend, but believe us, it’s not. Everything should be ready to scale and process large amounts of events. The interface should be lightning fast and intuitive, with no clunky loaders or flickering screens.
When choosing our technology stack, we followed our minimalistic approach, using as few third-party providers and wrappers as possible. We tried hard not to overengineer.
Back-end
API - We use Node.js with Hono, running on a Hetzner virtual private server. Works great.
General DB - PostgreSQL hosted at Neon, with automatic back-ups and monitoring in place. It's used for storing everything (users, projects, visitors, etc.) except events.
We use Drizzle as our ORM. No ORM is perfect, and Drizzle does the job just fine. We still have to write plain SQL for some of our more advanced queries, but the basics work nicely.
For our events warehouse we use ClickHouse, hosted on a Hetzner virtual private server. ClickHouse is a real-time database that ensures our dashboards, funnels, and user journeys are delivered as quickly as possible. We’ve had positive experiences working with it before, which is why we chose it again.
Front-end
Our front-end is Next.js hosted at Vercel. React might not be ideal for everyone, but it will always be our framework of choice due to its vast ecosystem and the number of open-source projects surrounding it. Despite some critiques of Vercel, it remains a great and easy way to serve the front end and use SSR.
Luxon for working with time. The library is amazing. Initially we went with DayJS, but it had limitations when working with time zones, so we switched and have never regretted it.
We use Recharts for rendering graphs at our dashboard. It is minimalistic and performs perfectly; we’ve been using it for quite some time in other projects.
We also use TypeScript both on client and server, which helps keeping everything structured and clean. Tailwind for css, which is fun and a great quality-of-life addition.
Third-party
We use Cloudflare as our Proxy and DNS hosting. We also take visitors' countries from Cloudflare’s CF-IPCountry
headers, so there’s no need for us to host any local country-by-IP databases or process any IP addresses at all, which is great. Cloudflare also has great anti-ddos mechanisms that might come in handy at some point.
For payments we went with Stripe. We’ve been using it for ages, and even after exploring the topic of merchants of record (MOR) vs. payment service providers (PSP) in the light of the rise of MOR services, we still chose Stripe.
We use Postmark for transactional emails. We don’t send out many emails, and Postmark handles them perfectly, without any need for IP warm-ups or any similar crazy things.
This should cover the main technologies that we are using. Feel free to try Seline to see how this all comes together, or contact us if you’d like to learn more details.