engineeringGetting started with SlackKitA step-by-step guide on creating a Slack app with SlackKit and Next.js
engineeringHow to model Slack webhook connections in KnockA step-by-step guide to modeling Slack webhook connections in Knock.
engineeringTaking a deep dive into Slack's Block KitA deep dive into Slack's Block Kit with examples on building static and interactive notifications for your Slack app.
engineeringHow to authenticate users with Slack using OAuthA step-by-step guide to using OAuth with Slack to authenticate users in a Node.js application.
engineeringHow to send in-app notifications with Next.jsA step-by-step guide to sending in-app feed notifications with Next.js using the app directory and React Server Components
engineeringZero downtime Postgres upgradesHow we upgraded from Postgres 11.9 to 15.3 with zero downtime
engineeringThe five principles of modern developer toolsA deep dive into how modern developer tools bring typing, CI/CD integration, and version control to engineering teams where they work.
engineeringWhy you need observability in notification systemsNotifications are a critical bridge between your product and your users. Learn why you need to add observability into your notification system.
engineeringHow we built our data warehouse connector using PrequelA deep dive on how and why we built our data warehouse connector using Prequel, a data warehouse connector as a service.
engineeringHow we built our workflow throttles using Redis StreamsA deep dive into how we built our throttle function with Redis Streams.
engineeringUsing our One and Done library to power idempotent API requestsA look at idempotent requests, why they are important, and how to use our new One and Done library to implement them in your Elixir applications.
engineeringThe developer's guide to notification system tooling in 2023An in-depth look at notification systems and the ecosystem of tools, frameworks, and vendors available.
engineeringHow to ORDER BY using the contents of a column in PostgresHow we solved a challenging customer request using Postgres.
engineeringImplementing SSO using WorkOSHow Knock used WorkOS to implement SAML 2.0 SSO quickly and efficiently in our Elixir codebase.
engineeringImplementing a usage-based billing system: integration deep dive (part 2)A closer look at implementation details in building a usage-based billing system powered by Orb.
engineeringSix findings we rely on when managing PostgreSQL indexesA look into how we evaluate which indexes to use and when to maximize query efficiency.
engineeringEvaluating usage-based billing providers: what engineers need to know (part 1)A look into our experience in buying and integrating a usage-based billing provider at Knock.
engineeringHow we built webhooks in KnockA deep dive into how we built our webhooks feature using the underlying Knock notification engine and a few learnings along the way.
engineeringHow we onboard engineers at a devtools startupA behind-the-scenes look at how we onboard new engineers at Knock, and the principles we use to do so.
engineeringControlling Elixir supervisors at runtime with feature flagsA look at how Knock uses Elixir and feature flags to adapt our software at runtime.
engineeringBuilding a batched notification engineA deep dive on how to design and build a batched system for your product notifications.
engineeringHow we use Postgres LTrees to surface API logsPostgres ships with the Label Tree data type. How Knock uses LTrees for fast API log search.
productengineeringHow we work: moving fast to ship customer valueA peek behind the curtain at Knock. How we work to optimize for shipping customer value, quickly.
engineeringUsing the Knock notification component to add an in-app feed to your productA look into how to set up and use Knock's in-app feed component.
engineeringUsing Knock to power Knock's notificationsGetting meta and showing the power of Knock to build our member invite feature.