1amageek/swift-web
SwiftWeb is a Swift framework for server-rendered web applications with an
What You Build
flowchart LR
App["SwiftWeb.App"] --> Scene["Scene and routes"]
Scene --> Page["@Page"]
Page --> Document["HTMLDocument"]
Document --> HTML["server-rendered HTML"]
Document --> Island["ClientComponent"]
Island --> WASM["Swift WASM runtime"]
WASM --> Browser["hydration, state, and events"]| Layer | Responsibility | |---|---| | SwiftHTML | HTML elements, reusable Component values, documents, and rendering | | SwiftWeb | Application scenes, pages, routing, request context, actions, and actors | | SwiftWebUI | Layout, controls, themes, modifiers, and client components | | sweb | Project generation, generated packages, development server, Storyboard, and production builds |
Requirements
SwiftWeb pins the host toolchain and WASM SDK to the same snapshot.
| Item | Required value | |---|---| | Swift tools version | 6.4 | | Swiftly selector | 6.4-snapshot-2026-07-17 | | Swift toolchain | swift-6.4.x-DEVELOPMENT-SNAPSHOT-2026-07-17-a | | Browser SDK | swift-6.4.x-DEVELOPMENT-SNAPSHOT-2026-07-17-a_wasm | | Package platform | macOS 26.2 or newer |
For WASM commands, point SwiftWeb at the real toolchain directory. A swiftly shim does not contain the matching wasm-ld executable.
export SWIFT_WEB_TOOLCHAIN_BIN="$HOME/Library/Developer/Toolchains/swift-6.4.x-DEVELOPMENT-SNAPSHOT-2026-07-17-a.xctoolchain/usr/bin"
export SWIFT_WEB_HOST_SWIFT="$SWIFT_WEB_TOOLCHAIN_BIN/swift"
export SWIFT_WEB_WASM_SWIFT="$SWIFT_WEB_TOOLCHAIN_BIN/swift"
export SWIFT_WEB_WASM_TOOLCHAIN_BIN="$SWIFT_WEB_TOOLCHAIN_BIN"
"$SWIFT_WEB_HOST_SWIFT" --version
test -x "$SWIFT_WEB_WASM_TOOLCHAIN_BIN/wasm-ld"See Toolchain for the complete host and WASM setup.
Quick Start
Install the sweb executable from the 0.9.0 release with Mint:
export PATH="$SWIFT_WEB_TOOLCHAIN_BIN:$PATH"
mint install 1amageek/swift-web@0.9.0 sweb
sweb --helpCreate and run an application:
sweb new MyApp --output .
cd MyApp
sweb devOpen http://127.0.0.1:3000. If port 3000 is occupied, sweb dev selects the next available port and prints it.
The generated package depends on released versions of SwiftWeb and SwiftHTML:
// swift-tools-version: 6.4
import PackageDescription
let package = Package(
name: "MyApp",
platforms: [.macOS("26.2")],
products: [
.library(name: "MyApp", targets: ["MyApp"]),
],
dependencies: [
.package(url: "https://github.com/1amageek/swift-web.git", from: "0.9.0"),
.package(url: "https://github.com/1amageek/swift-html.git", from: "0.15.0"),
],
targets: [
.target(
name: "MyApp",
dependencies: [
.product(name: "SwiftHTML", package: "swift-html"),
.product(name: "SwiftWeb", package: "swift-web"),
],
swiftSettings: [
.enableUpcomingFeature("ApproachableConcurrency"),
]
),
],
swiftLanguageModes: [.v6]
)Development Workflow
sweb dev maintains desired source state and the currently serving worker. It materializes generated packages, rebuilds changed browser/server paths, swaps a ready worker, and recovers from build failures without discarding the last good application.
flowchart LR
Edit["edit Sources"] --> Dev["sweb dev"]
Dev --> Prepare["materialize .swiftweb/generated"]
Prepare --> Build["build WASM and server worker"]
Build --> Serve["serve latest successful generation"]
Serve --> HMR["browser HMR or page patch"]
HMR --> EditGenerated content is build output. Keep application changes in Package.swift and Sources; do not edit .swiftweb/generated directly.
| Command | Purpose | |---|---| | sweb new <Name> [--output <directory>] | Create a minimal application | | sweb new <Name> --ai | Create a chat-oriented SwiftWebUI application | | sweb new <Name> --platform <preset-or-owner/repo> | Apply a deployment adapter template | | sweb prepare | Refresh generated dev, server, and WASM packages | | sweb xcode | Refresh and open .swiftweb/generated/dev | | sweb dev [--host <host>] [--port <port>] | Run the development reconciler and HMR server | | sweb storyboard | Generate and run the SwiftWebUI component Storyboard | | sweb build | Build the generated production server | | sweb build --wasm | Build and process browser WASM artifacts | | sweb clean [--storyboard] [--swiftpm] [--all] | Remove selected generated output |
All package commands accept --package-path <directory>. Build, dev, and Storyboard commands also accept --scratch-path <directory>.
Run sweb xcode to use the generated <AppName>-dev scheme in Xcode:
cd MyApp
sweb xcodeProduction Builds
Build the generated server package:
cd MyApp
sweb buildBuild the standard browser WASM runtime with the matching SDK:
sweb build \
--wasm \
--runtime standard \
--swift-sdk swift-6.4.x-DEVELOPMENT-SNAPSHOT-2026-07-17-a_wasm \
-c releaseThe production artifact processor strips non-runtime sections, runs wasm-opt -Oz when available, records a size report, and writes cached gzip and Brotli sidecars:
.swiftweb/generated/.build/wasm/out/Products/Release-webassembly-wasm32/
<product>.wasm
<product>.wasm.size.json
<product>.wasm.compression.json
<product>.wasm.gz
<product>.wasm.brThe public browser profile is standard Swift WASM. Embedded Swift WASM is not a supported SwiftWeb browser runtime.
Project Layout
MyApp/
├─ Package.swift
├─ Sources/MyApp/
│ ├─ App.swift
│ ├─ Routes/
│ └─ Components/
└─ .swiftweb/ generated; do not edit
├─ generated/dev/
├─ generated/server/
└─ generated/wasm/SwiftWeb itself is split into runtime, browser, UI, development, and host targets. The documentation index maps each current contract to its owning area.
Platform Adapters
Deployment integrations live outside the core package. sweb new can apply a preset or GitHub-backed adapter template and records its source in .swiftweb/platform.json:
sweb new Chat --ai --platform cloudflare --output .
sweb new App --platform owner/repository --output .
sweb new App --platform owner/repository/template --output .The adapter repository contract is documented in Platform Adapter Template Contract.
Examples
| Example | Demonstrates | |---|---| | HelloWorld | Minimal app, static @Page, SwiftHTML, and SwiftWebUI rendering | | CounterApp | Loaded pages, client state, hydration, server actions, and distributed actor RPC |
cd Examples/HelloWorld
sweb devDocumentation
Read the changelog for release-level changes, then use the documentation index for current public contracts, architecture decisions, and verification runbooks.
Contributing
Use the pinned toolchain for every validation command. Native tests run through Xcode with a timeout guard:
TOOLCHAINS=org.swift.64202607171a \
scripts/swift-test-hang-guard.sh \
--repeats 1 \
--timeout 1200 \
--build-timeout 1200 \
-- xcodebuild test \
-scheme swift-web-Package \
-destination platform=macOS \
-jobs 2 \
-parallel-testing-enabled NOThe complete browser-visible development path is verified separately:
cd Tests/BrowserE2E
npm run counter-wasmSee Development Reconciler Verification for the required environment and acceptance conditions.
License
SwiftWeb is available under the MIT License.
Package Metadata
Repository: 1amageek/swift-web
Default branch: main
README: README.md