Write once, run anywhere
The same Swift code runs on your own server, on Cloudflare, and on AWS. No platform-specific versions and no rewrites — you build one app.
PlumeKit
Write your app once — the pages, the data, the logic — and run the exact same code on your own server, on Cloudflare, or on AWS. No rewrites, no versions to keep in sync. And a genuine delight to build with.
import PlumeCore
import PlumeORM
@Model final class Post: Model {
var id: Int
var title: String
var published = false
}
public func buildApp() -> Application {
let app = Application()
app.get("/posts") { _ in
let posts = try await Post.where(Post.published == true)
.order(by: Post.id, .descending)
.all()
return .view(postsPage(posts: posts))
}
return app
}
@component PostsPage(posts: [Post]) {
@Layout(title: "Posts") {
<ul>@for post in posts {
<li>{post.title}</li>
}</ul>
}
}
$ plumekit new myapp
$ ./plumekit dev
→ http://127.0.0.1:8080
$ ./plumekit deploy
→ Cloudflare Worker live
The same Swift code runs on your own server, on Cloudflare, and on AWS. No platform-specific versions and no rewrites — you build one app.
Describe your data as plain Swift types and query it with confidence — mistakes are caught before your app even runs. Works with SQLite, Postgres, and Cloudflare D1.
Write clean templates with reusable components. They turn straight into fast Swift and are safe against injection by default — no separate template engine to run.
Databases, file storage, caching, queues, email — reach them all the same way, and switch providers per platform without changing a line of your code.
Sign-in and sessions, form validation, background jobs, scheduled tasks, and real-time updates come built in — so you can start on the interesting parts.
One command to create, run, test, and deploy. Generators write the boilerplate, tests get a fresh database, and when something breaks in development you see exactly what and where.