Sticks Logo

Burn the bundler.
Drop in the binary.

Modern web development is a landfill of transpilers, JSON glue APIs, and transitive dependencies. Sticks is an opinionated, zero-build, server-rendered web platform packaged as a single static Rust binary.

Read the Manifesto on GitHub See the Syntax ↓

Strict Execution Zones

Execution flows strictly top-to-bottom. Mutations and redirects live in the Effect Zone. Once the first byte of HTML is streamed, you are in the View Zone. Side effects are structurally forbidden.

Injection is Impossible

SQL queries must be string literals. No dynamic concatenation allowed. Output is escaped by default according to its type. Template re-scanning is impossible. Data is inert.

Rule S4: No Nesting

Blocks cannot nest inside other blocks. Deep UI branching is solved cleanly via sibling blocks, component composition, or client-side CSS state projection. Deal with it.

Drop-in simplicity.
Zero parsing conflicts.

The runtime engine never parses your HTML. It scans for || and |, and ignores absolutely everything else.

Because of this, you can drop any client-side framework (like Alpine.js or Tailwind) straight into your code. No escaping curly braces. No delimiter collisions. If you need a literal `$` inside a Sticks block, just write `$$`.

Live Alpine.js Demo

This counter runs purely on the client side via Alpine, living peacefully right next to Sticks code.

// 1. Effect Zone: Types, State, SQL
|| type User { String name; }
   Result $res = db.all("SELECT * FROM users", []);
   List<User> $users = $res.value as List<User>;
|

<!-- 2. View Zone: Read-only streaming -->
<h1 class="text-2xl">Registered Users</h1>

<ul>
  || for User $u in $users:
    <li>$u.name</li>
  ||| else:
    <li>No users found.</li>
  |
</ul>

Repository Pulse

⚡ SQLite Cache (< 4 hours old)
0
Stars
0
Forks
0
Issues
merien pushed to main (d2713786abe522fff86822d8d3d662b3c8f0b06a)
"refactoring"