Observability that doesn't cost a kidney.
Event logging, alerts and audit trails for apps that are too small for an enterprise observability bill and too important to run blind. One SDK call per event, a dashboard, and your data stays yours.
14-day trial on paid plans, no card required. Opens tiny-owl-kit.io.
A partner product
Tiny Owl is built by Net Partner 011. We build products together (JustBeforeGo is one), and we promote each other's tools: Tiny Owl is theirs, Alfa Audit and Legal Craft are mine. This site runs on it. Links to Tiny Owl from here are tagged so that referrals can be attributed.
One call per event
log(message, { severity, context }). Three severities: info, warning, error. JSON context on every event.
Signed ingest
Every request is HMAC-SHA256 signed with a project secret, timestamped, and nonce-protected against replay. The SDK does it for you.
SDKs for JavaScript, Python and PHP
Official packages, plus Express and Next.js adapters that capture method, route and status automatically. Nothing else is captured unless you pass it.
Alerts and audit trails
Email alerts on the events you choose, and a searchable trail with trace ids so related events stay together.
Your data stays yours
Export everything as CSV or JSON at any time. No lock-in.
VS Code extension
Browse events next to the code that produced them.
Solo developers, indie SaaS builders, small product teams and agencies running several client projects who want to know when something breaks without paying for, or learning, an enterprise stack.
The whole integration is one server-only module and a handful of calls. The wrapper is a no-op when the keys are missing, so previews and local dev work without the service, and it never throws or blocks a response.
// lib/observability.ts (server only)
import { TinyOwl } from '@tiny-owl-kit/observability';
const client = new TinyOwl({
apiKey: process.env.TINYOWL_API_KEY!,
projectSecret: process.env.TINYOWL_PROJECT_SECRET!,
baseUrl: 'https://be.tiny-owl-kit.io/api', // set it: the SDK default is localhost
timeout: 3000,
defaultContext: { service: 'belikenikola.com' },
});
type Opts = { severity?: 'info' | 'warning' | 'error'; context?: Record<string, unknown> };
export async function logEvent(message: string, opts: Opts = {}) {
try {
await client.log(message, { severity: opts.severity ?? 'info', context: opts.context });
} catch {
// never let logging take down the thing it observes
}
}// app/api/compliance/check/route.ts
void logEvent('Quick Check run', {
context: { actor: 'anon', host: 'example.se', score: 62, findings: 6 },
});
// instrumentation.ts — everything you didn't catch
export const onRequestError = async (err, request, ctx) => {
await logError('Unhandled server error', err, { path: request.path, routeType: ctx.routeType });
};Never emails, message bodies, tokens or request bodies. Context is ids, hosts, counts and error codes. The full write-up, including the one gotcha that would have dropped every production event, is in the post.
Install the SDK, log one event, set one alert. If it earns its place, add the rest. The documentation covers JavaScript, Python and PHP.