Skip to content

feat: pre-render sgdata pages with stale-while-revalidate #39

@justrach

Description

@justrach

Problem

sgdata pages fetch live data on every request. For data that updates every 5-15 minutes (weather, environment readings), there's no need to fetch on every page view.

Proposed Solution

Pre-render sgdata pages on a schedule and serve the pre-rendered HTML instantly. Revalidate in the background when data goes stale.

How it would work

pub const prerender = true;
pub const revalidate = 300; // seconds — re-render every 5 minutes

pub fn render(req: mer.Request) mer.Response {
    const weather = try mer.fetch(req.allocator, .{ .url = "..." });
    return mer.render(req.allocator, page(weather.body));
}
  1. On first request: render page, save to dist/, serve HTML
  2. On subsequent requests: serve dist/ HTML instantly (0ms render time)
  3. After revalidate seconds: next request triggers background re-render
  4. Old page served until new render completes (stale-while-revalidate)

Tasks

  • Add pub const revalidate: u32 support to route codegen
  • Implement background re-render timer in server.zig
  • Serve pre-rendered pages from dist/ with freshness check
  • For Workers: use Cron Triggers or Durable Objects for scheduled re-render
  • Update sgdata pages with revalidate = 300
  • Test: first request renders, subsequent requests serve instantly

Expected Impact

LCP: 5.4s → <0.5s for all requests after the first render.
Equivalent to Next.js ISR (Incremental Static Regeneration).

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or request

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions