Skip to main content

FluidKit

FluidKit Logo
Web development for the Pythonist

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

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

Documentation

CLI

fluidkit init                # scaffold SvelteKit project with FluidKit wired in
fluidkit dev                 # run FastAPI + Vite together with HMR
fluidkit build               # codegen + npm run build
fluidkit preview             # preview production build locally

No system Node.js required — FluidKit uses nodejs-wheel for all Node operations. npm, npx, and node are available through the CLI:

fluidkit install tailwindcss          # shorthand for npm install
fluidkit install -D prettier          # install as dev dependency
fluidkit npm run build                # any npm command
fluidkit npx sv add tailwindcss       # any npx command
fluidkit node scripts/seed.js         # run node directly

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": "src/**/*.py",
  "signed": true
}

NOTE: Flags override config. Config overrides defaults.

Built with

  • SvelteKit — frontend framework with remote functions
  • FastAPI — API layer and request handling
  • Pydantic — type extraction and validation
  • Jurigged — hot module reloading in dev mode
  • nodejs-wheel — bundled Node.js, no system install needed

Metadata

Release files for fluidkit 1.4.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for fluidkit 1.4.0
File Size Uploaded
fluidkit-1.4.0.tar.gz 53.0 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for fluidkit 1.4.0
File Interpreter ABI Platform
fluidkit-1.4.0-py3-none-any.whl Python 3 none any Details

Total release size: 115.6 kB

Release files / fluidkit-1.4.0.tar.gz

Download URL fluidkit-1.4.0.tar.gz
Size 53.0 kB
Tags Source
SHA-256 checksum
How to use checksums
d4cdb37bc5328cce8112f10886df552282757b905f45ba9dde6fb7cca14ca368
BLAKE2b-256 checksum
How to use checksums
46dec6a63e9fa2a199379470d99cab837ff1bf21894b1e5afeb46d16b206c1fd
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via uv/0.7.9

Release files / fluidkit-1.4.0-py3-none-any.whl

Download URL fluidkit-1.4.0-py3-none-any.whl
Size 62.5 kB
Tags Python 3
SHA-256 checksum
How to use checksums
ee1ac7a64d8d4559cb1d5faef372a5d48da796a5e57e6ab1c1ec30c3d2ddc24b
BLAKE2b-256 checksum
How to use checksums
1ca6400f5a1914b8bb90ee0d07acf2a7d137896c339658f487c9ad33fc787ff4
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via uv/0.7.9

Release history Release notifications | RSS feed

This release

1.4.0 This release

2 release files

1.3.3

2 release files

1.3.2

2 release files

1.3.1

2 release files

1.3.0

2 release files

1.2.0

2 release files

1.1.0

2 release files

1.0.6

2 release files

1.0.5

2 release files

1.0.4

2 release files

1.0.3

2 release files

1.0.2

2 release files

1.0.1

2 release files

1.0.0

2 release files

0.2.9

2 release files

0.2.8

2 release files

0.2.7

2 release files

0.2.6

2 release files

0.2.5

2 release files

0.2.4

2 release files

0.2.3

2 release files

0.2.2

2 release files

0.2.1

2 release files

0.2.0

2 release files

0.1.3

2 release files

0.1.2

2 release files

0.1.1

2 release files

0.1.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page