Shield renders · Shell wakes · HTML stays the bridge

Server-first UI for people who still like the web.

SchildW3rk keeps the server responsible for truth, the browser responsible for interaction, and HTML as the bridge between both.

01

HTML is the bridge

Direct requests return real documents. Warm navigation may use Page Payloads, but it still starts from server-owned state.

02

Client state stays local

Shell wakes existing markup and owns small UI state. It does not become a second backend or a hidden router.

03

Backend stays backend

Shield resources, services and models keep HTTP, business logic and persistence concerns explicit.

Runtime flow

One request, one source of truth.

The server chooses the view and data. The browser wakes the HTML that already exists.

request

Resource handles HTTP

Params, input, guards and middleware live at the HTTP boundary.

render

Shield returns a view

The server selects a Shell view and sends props, head metadata, cache policy and assets.

wake

Shell adopts the page

The browser wakes SSR markers and enhances links/forms without turning the app into RPC.

page result

The server chooses the view.

A Resource returns a page result. The client receives the selected view and props, not a frontend-defined backend call.

ts
return page({  view: Projects,  props: {    title: 'Projects',    projects  },  head: {    title: 'Projects'  }})

client entry

The browser wakes what already exists.

Shield owns the root target and serialized props. The client entry stays small and explicit.

ts
import './style.css'import { wakeRoot } from '@schildw3rk/shield/client'import App from './App.shell'wakeRoot(App)

Package map

Small pieces, hard boundaries.

Open packages

frontend

@schildw3rk/shell

Components, local state, SSR markers, wake and the stable root.

server

@schildw3rk/shield

Resources, page envelopes, app.start, Node adapter and security defaults.

build

@schildw3rk/vite

Shell compilation, generated view registry and production manifest assets.

Where to start

Read the concepts first. The API makes more sense after the boundaries are clear.