Architecture

A platform engineered to be reviewed.

Strkr was built for the diligence call before it was built for the dashboard. Row-level tenant isolation. A documented public API. Serverless compute that scales on demand. Weekly deploys with reversible releases. The architecture is the product.

Multi-tenancy

Row-level isolation, not a promise.

Every customer-data table in Strkr carries a tenant_id column. Every query the API runs is scoped to the authenticated session's tenant before it leaves the handler. Cross-tenant reads are not a policy decision or a code-review item. They are architecturally impossible, because the query layer refuses to compile a statement that is missing the scope.

This matters because the alternative is the pattern that most multi-tenant SaaS still uses: shared tables with permissions enforced at the controller. One missed middleware, one developer who copies a snippet from a public gist, and a bug becomes a breach. Strkr pushes the enforcement down to the data layer so the controller cannot forget.

Tenant scoping extends through audit logs, exports, backups, and search indexes. A workspace that gets deleted is gone from every surface, not quarantined behind a cron job that someone forgot to run.

Enforcement

Scoped at the query layer.

Drizzle schema requires tenant_id on every customer-data table. The query builder rejects statements that are missing the scope. The pattern is enforced by TypeScript, not by review.

Boundaries

Nothing crosses tenant lines.

Audit logs, exports, search indexes, and backups are all tenant-scoped. A tenant deletion removes the data from every surface, not just the primary tables.

Verification

Property-based tests on isolation.

Automated tests fuzz tenant_id values against every public endpoint. Any route that returns data from a tenant the session does not own fails the build.

The stack

Boring technology, picked on purpose.

Strkr runs on AWS. The compute tier is Lambda behind API Gateway. The data tier is Postgres on RDS. Static assets live in S3 and are fronted by CloudFront. Authentication is handled by Clerk. The marketing site is Astro. The web app is React.

None of those choices are novel. That is the point. Every component in the stack is a service that has been operated at scale for a decade or more. The team can hire engineers who already know how to debug Lambda cold starts. The ops burden is predictable. The failure modes are well documented. When something breaks at 2 a.m., there is a runbook, not a research project.

The flip side of boring technology is that the interesting work ends up in the product, not in the infrastructure. Strkr spends engineering cycles on custom objects, field-level permissions, and the flow builder, instead of on reinventing the deployment pipeline.

Compute
AWS Lambda + API Gateway
Serverless. Scales to zero on idle. 1000 concurrent execution budget per region. Regional failover for the public API.
Database
Postgres on AWS RDS
Managed Postgres with cross-AZ failover. Encrypted at rest via KMS. Point-in-time recovery with continuous WAL shipping.
Static assets
AWS S3 + CloudFront
Marketing site is an Astro static build on CloudFront. App bundles ship through CloudFront with cache-busted hashes.
Authentication
Clerk
Email + password, OAuth (Google, Microsoft), MFA for owner roles. SSO + verified domains on Scale. JWT-based session tokens validated at the API Gateway.
Marketing site
Astro + CloudFront
Static-site generation. Deploys land in minutes. Zero runtime on the marketing surface, which keeps the attack surface small.
Web application
React 18 + Vite + TypeScript
Typed end to end. Shared packages for types, DB schema, and client contracts. Preview deploys per branch for QA before merge.
The data model

Core objects, custom objects, field-level permissions.

Strkr ships with a core data model that mirrors the real work of a revenue team. Accounts. Contacts. Deals. Opportunities. Activities. Tasks. Products. Line items. The relationships between those objects are enforced in the schema, not papered over in the UI, which means reporting against the model is reliable and imports do not quietly break foreign keys.

Alongside the core objects, every workspace can define custom objects. A property management firm can model buildings, units, and leases as first-class records. A consulting firm can model engagements, phases, and deliverables. Custom objects get the same treatment as core objects: audit logs, API coverage, permission scoping, import and export, and reporting.

On top of the record model sits a field-level permission system. Any field, on any object, can be hidden, read-only, or writeable per role and per team. The permission layer is enforced on the server, not just in the UI, so a user who inspects the API response cannot see a field that policy hid from them in the layout.

Core objects

The relationships are typed.

Accounts, contacts, deals, opportunities, activities, tasks, products, line items. Foreign keys enforced at the database. Join tables where many-to-many is real. No pretending the model is flat.

Custom objects

A real schema, not a note field.

Define custom objects with typed fields, relationships to core objects, and their own layouts. The admin surface writes real schema changes, not a key-value table that masquerades as flexibility.

Field permissions

Enforced on the server.

Hide, read-only, or writeable per role and per team. The API applies the mask before it serializes the response, so inspecting the network tab does not leak hidden fields.

The public API

API-first, with a documented v1.

The product and the API are the same product. Every record a user sees in the web app came from a documented endpoint, and every endpoint that powers the web app is reachable from the public API with the same scopes and the same permission enforcement. The web app is a client. It is not privileged.

The v1 API lives at api.strkr.io. The OpenAPI 3.1 specification is served from /v1/openapi.json, which means a buyer can generate a typed client in any language in under a minute. A Swagger UI reference is hosted at /v1/docs for teams who want to click through the surface before writing code.

Authentication uses workspace API keys with scopes. Rate limits are per-key, per-endpoint, with headers that make the ceiling and the window visible in every response. Webhook signing uses HMAC-SHA256 with timestamp verification. Pagination is cursor-based across every list endpoint. The patterns are the patterns a buyer expects, documented in one place, implemented the same way across every surface.

Endpoints
28 documented endpoints across core objects, activities, tasks, pipelines, products, custom objects, webhooks, and the audit log.
Spec
OpenAPI 3.1 at /v1/openapi.json. Regenerated on every API deploy. Typed clients can be built from it in Go, TypeScript, Python, Ruby, PHP, Rust.
Docs
Swagger UI at /v1/docs. Click through the surface, read request and response schemas, run calls against a sandbox token.
Auth
Workspace API keys with scopes. Keys ship from the Admin surface. Scopes map 1:1 to the role-based permissions used by the web app.
Webhooks
HMAC-SHA256 signing with a replay-protection timestamp. Automatic retries on 5xx with exponential backoff. Delivery log on every workspace.
Deployment

Weekly through Pulumi, reversible by design.

Every piece of Strkr infrastructure is defined in TypeScript using Pulumi. The route tables, the Lambda functions, the RDS parameter groups, the CloudFront behaviors, the IAM policies, and the secrets wiring all live in version control. No one logs into the AWS console to make a production change. Every deploy is a pull request, reviewed, and traceable.

Deploys run from CI on green builds. The pipeline builds the application once, deploys to the dev environment, runs an automated smoke test, and then promotes the same artifact to production. The dev-before-prod pattern is enforced in the pipeline, not in a checklist. Every production release went through dev first, every time, with no exceptions for "small" changes.

Releases are reversible. The API route registration is append-only, which means an older client never finds a route it used to call missing from the current build. Database migrations run forward only, with the schema designed so that the previous API version is still valid against the next schema. The result is zero-downtime rolling deploys that most customers never notice happened.

IaC

Pulumi, in TypeScript.

Every AWS resource is defined in code and reviewed in pull requests. No console drift. No tribal knowledge about which setting is wired in which account.

Cadence

Weekly deploys, often more.

Features ship as soon as they are ready. Shipping weekly means every deploy is small, every rollback is targeted, and the platform a customer adopts in January is better in April.

Reversibility

Append-only routes, forward-only migrations.

The API route table is append-only. Older clients never find a route missing. Migrations run forward only, with the previous API version always valid against the next schema.

Reliability

The backup story, told honestly.

Strkr runs point-in-time recovery with a seven-day retention window. Continuous write-ahead log shipping sends every committed transaction to an encrypted store in a separate AWS account, which means recovery is possible to any second inside the window, not just to a nightly snapshot. The RDS instance is cross-AZ, so a single availability zone failure does not take the database offline.

Lambda, API Gateway, and CloudFront are regional services that AWS operates across multiple availability zones by default. If one AZ in the primary region fails, traffic rebalances automatically. If the primary region fails, DNS failover routes to the standby region, with the understanding that cross-region recovery is measured in minutes, not seconds.

Disaster recovery is tested quarterly. The test is not a tabletop exercise. The team actually restores a snapshot into a fresh account, points the test environment at it, and verifies that the application comes up with every tenant intact. The runbook is the runbook because it has been run.

Observability

Metrics, logs, traces, correlation IDs.

Every API request on Strkr starts with a correlation ID that follows the request through every Lambda invocation, every database query, every outbound call to a third-party integration, and every log line that the handler emits. When support needs to debug a problem, the correlation ID is one search away from the full trace.

CloudWatch collects metrics on every Lambda. The dashboards expose request rate, latency percentiles, error rate, and cold-start count per endpoint. Alarms fire on p99 latency and on 5xx error rate, routed to on-call before customers notice. The team's goal is boring dashboards.

Structured logs make the correlation ID searchable, which means tracing a request from the API Gateway through to the database query and the webhook delivery takes minutes, not an afternoon. The audit log, exposed to every workspace owner, is a separate surface built for the customer's incident response, not an operational log that happens to be visible.

Metrics

CloudWatch, every endpoint.

Request rate, latency percentiles, error rate, and cold-start count per endpoint. Dashboards exist for every service. Alarms route to on-call, not to an unread inbox.

Logs

Structured, correlated, searchable.

Every log line carries the correlation ID of the request that produced it. Searching one ID returns the full trace from the Gateway through the database and back.

Tracing

One ID follows the request.

A correlation ID starts at the Gateway, flows through every Lambda invocation, every DB query, every webhook delivery. Support debugging is a search, not an archaeology dig.

Scale posture

Headroom today, headroom tomorrow.

The AWS Lambda concurrent execution quota for the Strkr account was raised to 1000 in October 2026. That ceiling is not a limit the product is anywhere near touching. It is headroom that exists to make burst traffic a non-event, which matters when a customer's marketing team schedules an email send that spikes webhook traffic by three orders of magnitude for twenty minutes.

The database tier is sized conservatively today, with a tested upgrade path to the next instance class that can be executed in a maintenance window of under five minutes. Postgres read replicas are a one-line Pulumi change away for reporting workloads that eventually need to isolate from write traffic.

On the AI roadmap, the vector-search workload is designed around DiskANN, an SSD-friendly index that trades a small amount of recall for an order of magnitude better insert performance over HNSW at scale. The decision was made because contact enrichment and the semantic search surfaces will index tens of millions of records per workspace, which is the regime where DiskANN wins and HNSW slows to a crawl.

Compute budget

1000 concurrent Lambdas.

The AWS quota was raised to 1000 in October 2026. The ceiling exists to make burst traffic a non-event, not because the platform is near it.

Database path

Vertical and horizontal both ready.

Current instance class has headroom. Next tier is a one-command upgrade in a maintenance window. Read replicas are a Pulumi change away when reporting workloads need isolation.

Vector search

DiskANN-ready on the roadmap.

The AI surfaces are designed around DiskANN for SSD-friendly indexing at scale. Trades a small amount of recall for an order of magnitude better insert performance over HNSW.

Try it free. Bring your team next week.

No sales call, no migration consultant, no four-month implementation. Enter your card, get 14 days of the full Pro tier, cancel any time before day 14 with zero charge. Spin up a workspace, import your CSV, and have something useful before lunch.