Skip to content

Senior engineering · End-to-end delivery

From product intent to systems you can operate.

Interfaces, typed boundaries, asynchronous work, deployment, and recovery. Direct engineering involvement across the product and the systems that keep it running.

Engineering in practice

Make the important boundaries explicit.

Illustrative code excerpts, simplified to show one decision at a time. Each makes an assumption, failure, or lifecycle easier to reason about.

Validate external responses before they enter the application. An unexpected shape becomes an identifiable integration failure.

Implicit assumption
async function loadUser(id: string) {
  const response = await fetch(`/api/users/${id}`);
  const data = await response.json();
  return data.profile.name;
}
Explicit boundary
const User = z.object({
  id: z.string().uuid(),
  profile: z.object({ name: z.string() })
});

async function loadUser(id: string) {
  const response = await fetch(`/api/users/${id}`);
  if (!response.ok) throw new Error("HTTP failure");
  const user = User.parse(await response.json());
  return user.profile.name;
}

Represent expected failures in the return type so callers must decide how to handle them. Record useful context for diagnosis.

Implicit assumption
async function loadReport(id: string) {
  try {
    return await reports.get(id);
  } catch {
    return null;
  }
}
Explicit boundary
type ReportResult =
  | { ok: true; report: Report }
  | { ok: false; reason: "unavailable" };

async function loadReport(id: string): Promise<ReportResult> {
  try {
    return { ok: true, report: await reports.get(id) };
  } catch (error) {
    telemetry.capture(error, { reportId: id });
    return { ok: false, reason: "unavailable" };
  }
}

Declare infrastructure in version control so changes can be reviewed and environments reproduced. This excerpt shows storage configuration, not a complete deployment.

Implicit assumption
Azure Portal
  → Create storage account manually
  → Choose settings from memory
  → Repeat for the next environment
Explicit boundary
resource "azurerm_storage_account" "results" {
  name                     = var.storage_name
  resource_group_name      = var.resource_group_name
  location                 = var.location
  account_tier             = "Standard"
  account_replication_type = "LRS"
  min_tls_version          = "TLS1_2"
  allow_nested_items_to_be_public = false
}

Compute derived values and give subscriptions an explicit lifetime. Immutable updates avoid stale state and cleanup prevents duplicate listeners.

Implicit assumption
useEffect(() => {
  socket.on("item", (item: Item) => {
    items.push(item);
    setItems([...items]);
  });
}, [items]);
Explicit boundary
useEffect(() => {
  const receive = (item: Item) => {
    setItems(current => [...current, item]);
  };
  socket.on("item", receive);
  return () => { socket.off("item", receive); };
}, [socket]);

const total = items.reduce(
  (sum, item) => sum + item.value, 0
);

Selected work

The systems behind the product.

Explore the constraints, architecture, and operating decisions behind four shipped products.

Recruitment · AI workflows

Skilltage

A multi-tenant product with typed APIs, asynchronous inference, explicit access boundaries, and an operating layer designed alongside the user journeys.

Processing
Lambda APIs, SQS workers, retries, and dead-letter queues.
Contracts
Schema-validated evidence with traced processing stages.
Operations
Idempotent metering, Stripe billing, and retention jobs.
Read case study

Geodata · Consumer product

Skyggeplaner

A geospatial simulation core connected to address preflight, one-off payments, queue-based rendering, and private result delivery.

Inputs
Official parcel, building, and elevation data.
Compute
Solar geometry and reproducible asynchronous rendering.
Lifecycle
Conservative preflight and time-limited private results.
Read case study

Mobile · AI voice coaching

soil.health

Cross-platform voice coaching with long-form audio sessions, persistent conversation context, subscriptions, and ongoing store delivery.

Platforms
A working product for iOS and Android.
Product loop
Audio sessions, personal reflections, and memory.
Delivery
Subscription flows and continued store updates.
Read case study

Public data · Discovery platform

danskegrundskoler.dk

Fragmented government datasets shaped into school and municipality views with filtering, comparisons, analytics, and structured discovery.

Data
Public datasets brought into a coherent read experience.
Surfaces
School and municipality views with shared comparisons.
Operations
Continued maintenance for data quality and UX.
Read case study
Janus Jektvik

Janus Jektvik · Founder

Your technical counterpart.

You work directly with Janus, a software consultant whose experience spans backend, frontend, mobile, cloud, and regulated environments.

I stay involved from product decisions through implementation and operation. The architecture should serve the work, and the work should stay understandable. Additional capacity comes in when the project calls for it.

Previous roles at Dawn Health and Netcompany span health software, enterprise systems, and banking. That experience informs how I approach product delivery today.

More about Janus

Let’s discuss your delivery challenge.

A new product, an architecture decision, or a system that needs attention. Bring the context and we can talk through the constraints and the work ahead.

Change your perspective ↑