Python backend, SvelteKit frontend, zero boilerplate in between.
Project description
FluidKit
FluidKit bridges Python and SvelteKit into a unified fullstack framework. Write backend functions in Python — FluidKit registers them as FastAPI endpoints and wraps them in SvelteKit-native remote functions with full type safety, cookie forwarding, file uploads, redirects, and single-flight cache invalidation.
pip install fluidkit
How it works
Decorate Python functions. FluidKit registers them as FastAPI endpoints internally and generates colocated .remote.ts files that SvelteKit imports as remote functions directly.
# src/lib/demo.py
from fluidkit import query, command, form
db = {
"posts": [
{"id": 1, "title": "Hello World", "content": "This is the first post.", "likes": 10},
{"id": 2, "title": "Fluidkit", "content": "Fluidkit is awesome!", "likes": 50},
{"id": 3, "title": "Python and Svelte", "content": "Using Python with Svelte is great!", "likes": 25},
]
}
@query
async def get_posts():
return db["posts"]
@command
async def like_post(post_id: int):
for post in db["posts"]:
if post["id"] == post_id:
post["likes"] += 1
# invalidates client cache in the same request with single flight mutations
await get_posts().refresh()
return True
return None
@form
async def add_post(title: str, content: str):
new_post = {
"id": len(db["posts"]) + 1,
"title": title,
"content": content,
"likes": 0,
}
db["posts"].append(new_post)
await get_posts().refresh() # invalidates client cache in the same request with single flight mutations
<!-- src/routes/+page.svelte -->
<script>
import { get_posts, like_post, add_post } from '$lib/demo.remote';
</script>
<form {...add_post}>
<input {...add_post.fields.title.as('text')} placeholder="Title" />
<input {...add_post.fields.content.as('text')} placeholder="Content" />
<button>Add Post</button>
</form>
{#each await get_posts() as post}
<div>
<h2>{post.title}</h2>
<p>{post.content}</p>
<button onclick={async () => await like_post(post.id)}>
👍 {post.likes}
</button>
</div>
{/each}
No manual fetch calls. No duplicated types. No glue code.
🤫 how does this work?
FluidKit reflects on your decorated functions at import time — inspecting parameters, return types, and Pydantic models — and generates colocated `.remote.ts` files wrapping each function in a SvelteKit-native `query`, `command`, `form`, or `prerender` remote function call. In dev mode this re-runs on every save via HMR. The generated files are real TypeScript you can inspect, import, and version control.Decorators
Decorators
| Decorator | Use case | SvelteKit docs |
|---|---|---|
@query |
Read data — cached, refreshable | query |
@command |
Write data — single-flight cache invalidation | command |
@form |
Form actions — file uploads, progressive enhancement, redirects | form |
@prerender |
Build-time data fetching with optional runtime fallback | prerender |
CLI
fluidkit init # scaffold SvelteKit project with FluidKit wired in
fluidkit dev # run FastAPI + Vite together with HMR
fluidkit build # codegen + npm run build
Project config
// fluidkit.config.json
{
"entry": "src/app.py",
"host": "0.0.0.0",
"backend_port": 8000,
"frontend_port": 5173,
"schema_output": "src/lib/fluidkit",
"watch_pattern": "./*.py"
}
Flags override config. Config overrides defaults.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file fluidkit-1.0.4.tar.gz.
File metadata
- Download URL: fluidkit-1.0.4.tar.gz
- Upload date:
- Size: 38.4 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.5.30
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
c5734e0bc4c45ca16d21735ef93eb9766177e853d713707c8e99b079a48a8740
|
|
| MD5 |
1edf8f723d37d7a7022b854b30fa2a65
|
|
| BLAKE2b-256 |
188aa077745151218120abc5e4cec86bf23dc71cd48b30a7e139f99dc210ff5d
|
File details
Details for the file fluidkit-1.0.4-py3-none-any.whl.
File metadata
- Download URL: fluidkit-1.0.4-py3-none-any.whl
- Upload date:
- Size: 45.9 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.5.30
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
40dc308ec127e4115c962ad9f0151406deb6cc7fa75ffa75484e38089850513d
|
|
| MD5 |
f7ee0239005c0a1636492c3cfafeed52
|
|
| BLAKE2b-256 |
753824cc84c4987b2953fd6b7c4e7293103d1ff9b2eb2321389647652ebb1f1f
|