Build Beautiful Web Applications
A modern, expressive web framework that combines the elegance of Ruby with the performance of Rust. Build faster, ship sooner, sleep better.
class Post < Model
# Validations
validates("title", {
"presence": true,
"min_length": 3
})
validates("author_id", { "presence": true })
# Relationships via methods
def author
User.find(this.author_id)
end
def comments
Comment.where(
"doc.post_id == @id",
{ "id": this.id }
)
end
end
<!-- ERB-style templates -->
<h1><%= @title %></h1>
<div class="posts">
<% for post in @posts %>
<article>
<h2><%= post["title"] %></h2>
<p><%= post["excerpt"] %></p>
<a href="/posts/<%= post["id"] %>">
Read more
</a>
</article>
<% end %>
</div>
class PostsController < Controller
def index(req)
let posts = Post
.where("doc.status == @s", { "s": "published" })
.order("created_at", "desc")
.limit(10)
.all
render("posts/index", {
"title": "Latest Posts",
"posts": posts
})
end
def create(req)
let result = Post.create(req["params"]);
if result["valid"]
return redirect("/posts");
end
render("posts/new")
end
end
Why Soli?
Everything you need to build modern web apps
Stop wrestling with configuration. Soli includes batteries, so you can focus on building.
Blazing Fast Performance
Built on Rust for raw speed, with the expressiveness of Ruby. Soli handles over 1.2 million plaintext requests per second.
Secure by Default
Security isn't an afterthought. We include CSRF protection, secure headers, and SQL injection prevention.
- CSRF Token Validation
- XSS Sanitization
- Secure Session Cookies
Instant Hot Reload
See your changes instantly. Soli watches your files and recompiles in milliseconds, keeping your development flow uninterrupted.
Battery-Included ORM
Powerful Active Record ORM with migrations, relationships, and validations. Database work made simple.
Developer Experience
Beautiful error pages, convention over configuration, and intuitive APIs designed for developer happiness.
World-Class Performance
Ranked among the fastest web frameworks in the world
Benchmarks run on 21 AWS c7i.2xlarge instances via TechEmpower
Scaffold Generator
Generate complete MVC resources in seconds
$ soli generate scaffold blog_posts title:string content:text author:string published:boolean Success! Created scaffold for blog_posts # Generated files: app/models/blog_posts_model.sl app/controllers/blog_posts_controller.sl app/views/blog_posts/index.html.slv app/views/blog_posts/show.html.slv app/views/blog_posts/new.html.slv app/views/blog_posts/edit.html.slv app/views/blog_posts/_form.html.slv tests/models/blog_posts_test.sl tests/controllers/blog_posts_controller_test.sl db/migrations/*create_blog_posts_*.sl ✓ Routes added to config/routes.sl
Powered by SoliDB
A distributed, ACID-compliant multi-model database built in Rust. Documents, time-series, graph, key-value, vector search, and blob storage — all in a single runtime.
class User < Model
validates("email", {
"presence": true,
"uniqueness": true
})
validates("name", {
"presence": true,
"min_length": 2
})
before_save("normalize_email")
after_create("send_welcome_email")
def normalize_email
this.email = this.email.downcase
end
def posts
Post.where("doc.user_id == @id", { "id": this.id })
end
end
# Chainable query builder
let admins = User
.where("doc.role == @role", { "role": "admin" })
.where("doc.active == @a", { "a": true })
.order("created_at", "desc")
.limit(10)
.all
# CRUD with validations
let result = User.create({
"name": "Alice",
"email": "[email protected]"
})
if result["valid"]
redirect("/users/" + result["record"]["id"])
else
render("users/new", { "errors": result["errors"] })
end
def up(db)
db.create_collection("users")
db.create_index("users", "idx_email", ["email"], { "unique": true })
db.create_index("users", "idx_role", ["role"], {})
end
def down(db)
db.drop_collection("users")
end
Live Queries
WebSocket-powered real-time updates. Query once, get live changes pushed to clients.
ACID Transactions
Multi-document atomic commits, rollbacks, and configurable isolation levels.
Distributed
Master-master replication, auto-sharding, and automatic failover built in.
Lua Runtime
Embedded scripting for triggers, stored procedures, and server-side logic.
Live View
Server-rendered reactive components without writing JavaScript
Connecting...
Connecting...
<!-- That's it. No JavaScript needed! -->
<div class="counter">
<h2>@count</h2>
<button soli-click="decrement">-</button>
<button soli-click="increment">+</button>
</div>
# Server pushes updates via tick events
def metrics(event)
if event["type"] == "tick"
return {
"state": {
"time": now(),
"cpu": system_cpu(),
"memory": system_memory()
}
};
end
{}
end
Ready to build something amazing?
Join the developer* who is already building faster with Soli.
* It's just me. But I'm having a great time!