Every time I set up error tracking for a European client, the same conversation came up - the error data would be going to US servers, followed by all the "where does the data actually live" questions that GDPR brings with it. The tools themselves are fine, Sentry, Bugsnag and the rest all work well, they are just US-hosted. AppLogger runs entirely on European infrastructure, and the data is stored in the EU, under GDPR jurisdiction.
There was a second reason too. After two decades of PHP I wanted to build a backend in Go, and this was the project I did it with.
How It's Built
The engine is Go with ClickHouse underneath - error tracking means heavy writes and heavy aggregate queries, and that is exactly the workload ClickHouse is built for. The ingestion pipeline was a good place to learn what the language is actually like under load.
On the PHP side there is a Symfony bundle that handles exception listeners, context collection and automatic JavaScript snippet injection for frontend errors. The session replay recorder captures DOM mutations and user interactions without the overhead of video recording - it reconstructs the session from events instead of storing footage.
What It Does
The core is straightforward error tracking for Symfony applications: PHP exceptions, JavaScript errors, full stack traces. Getting started is a Symfony Flex recipe - composer require, add your DSN, and errors start showing up in the dashboard.
Session replay shows what the user did leading up to an error (clicks, navigation, form interactions), rendered as a DOM visualization. The recorder only captures the sequence of events - text input and other personal data are never recorded.
Grouping keeps a single bug from turning into hundreds of separate reports, and when an error that was marked resolved shows up again in a new release, it gets flagged as a regression. Alerts go out over Slack or email, immediately or batched into a digest, and I tune that per project.
Team features are all included - roles, assigning errors to people, as many members as you want (I never understood why seats should be the expensive part) - and there is no separate paid tier for any of it.