π§The highly productive Julia web framework
2,414
stars
907
commits
Julia
primary language
Sep 4, 2026
updated
Genie.jl is the backbone of the Genie Framework, which provides a streamlined and efficient workflow for developing modern web applications. It builds on Julia's strengths (high-level, high-performance, dynamic, JIT compiled), exposing a rich API and a powerful toolset for productive web development.
Genie Framework is composed of four main components:
To learn more about Genie, visit the documentation, and the app gallery.
If you need help with anything, you can find us on Discord.
https://github.com/GenieFramework/Genie.jl/assets/5058397/627dcda0-bb13-49f9-8827-2bfb581a9bb7
Julia data dashboard powered by Genie. App gallery
π Genie Router: Genie has a really powerful
πͺ Router. Matching web requests to functions, extracting and setting up the request's variables and the execution environment, and invoking the response methods. Features include:
GET, POST, PUT, PATCH, DELETE, OPTIONS)# Genie Hello World!
# As simple as Hello
using Genie
route("/hello") do
"Welcome to Genie!"
end
# Powerful high-performance HTML view templates
using Genie.Renderer.Html
route("/html") do
h1("Welcome to Genie!") |> html
end
# JSON rendering built in
using Genie.Renderer.Json
route("/json") do
(:greeting => "Welcome to Genie!") |> json
end
# Start the app!
up(8888)
π WebSocket: Genie provides a powerful workflow for client-server communication over websockets
julia> using Genie, Genie.Router
julia> channel("/foo/bar") do
# process request
end
[WS] /foo/bar => #1 | :foo_bar
π Templating: Built-in templates support for HTML, JSON, Markdown, JavaScript views.
π Authentication: Easy to add database backed authentication for restricted area of a website.
julia> using Pkg
julia> Pkg.add("GenieAuthentication") # adding authentication plugin
julia> using GenieAuthentication
julia> GenieAuthentication.install(@__DIR__)
β° Tasks: Tasks allow you to perform various operations and hook them with crons jobs for automation
module S3DBTask
# ... hidden code
"""
Downloads S3 files to local disk.
Populate the database from CSV file
"""
function runtask()
mktempdir() do directory
@info "Path of directory" directory
# download record file
download(RECORD_URL)
# unzip file
unzip(directory)
# dump to database
dbdump(directory)
end
end
# ... more hidden code
end
$ bin/runtask S3DBTask
π¦ Plugin Ecosystem: Explore plugins built by the community such as GenieAuthentication, GenieAutoreload, GenieAuthorisation, and more
ποΈ ORM Support: Explore SearchLight a complete ORM solution for Genie, supporting Postgres, MySQL, SQLite and other adapters
function search(user_names, regions, startdate, enddate)
# ... hidden code
where_filters = SQLWhereEntity[
SQLWhereExpression("lower(user_name) IN ( $(repeat("?,", length(user_names))[1:end-1] ) )", user_names),
SQLWhereExpression("date >= ? AND date <= ?", startdate, enddate)
]
SearchLight.find(UserRecord, where_filters, order=["record.date"])
# ... more hidden code
end
Database Migrationsmodule CreateTableRecord
import SearchLight.Migrations: create_table, column, primary_key, add_index, drop_table
function up()
create_table(:record) do
[
primary_key()
column(:user_uuid, :string, limit = 100)
column(:user_name, :string, limit = 100)
column(:status, :integer, limit = 4)
column(:region, :string, limit = 20)
column(:date_of_birth, :string, limit = 100)
]
end
add_index(:record, :user_uuid)
add_index(:record, :user_name)
add_index(:record, :region)
add_index(:record, :date_of_birth)
end
function down()
drop_table(:record)
end
end
Model Validationsπ More Genie features like:
Files Uploadsroute("/", method = POST) do
if infilespayload(:yourfile)
write(filespayload(:yourfile))
stat(filename(filespayload(:yourfile)))
else
"No file uploaded"
end
end
Logging | Caching | Cookies and Sessions | Docker, Heroku, JuliaHub, etc Integrations | Genie DeployPlease contribute using GitHub Flow. Create a branch, add commits, and open a pull request.
Please read CONTRIBUTING for details on our CODE OF CONDUCT, and the process for submitting pull requests to us.
The awesome Genie logo was designed by Alvaro Casanova
Hoppscoth for readme structure template
Genie uses a multitude of packages that have been kindly contributed by the Julia community
This project is licensed under the MIT License - see the LICENSE file for details.
β If you enjoy this project please consider starring the π§ Genie.jl GitHub repo. It will help us fund our open source projects.
(top 30 of 64)
Julia
73.2%
JavaScript
26.8%
π§The highly productive Julia web framework
2,414
stars
907
commits
Julia
primary language
Sep 4, 2026
updated
Genie.jl is the backbone of the Genie Framework, which provides a streamlined and efficient workflow for developing modern web applications. It builds on Julia's strengths (high-level, high-performance, dynamic, JIT compiled), exposing a rich API and a powerful toolset for productive web development.
Genie Framework is composed of four main components:
To learn more about Genie, visit the documentation, and the app gallery.
If you need help with anything, you can find us on Discord.
https://github.com/GenieFramework/Genie.jl/assets/5058397/627dcda0-bb13-49f9-8827-2bfb581a9bb7
Julia data dashboard powered by Genie. App gallery
π Genie Router: Genie has a really powerful
πͺ Router. Matching web requests to functions, extracting and setting up the request's variables and the execution environment, and invoking the response methods. Features include:
GET, POST, PUT, PATCH, DELETE, OPTIONS)# Genie Hello World!
# As simple as Hello
using Genie
route("/hello") do
"Welcome to Genie!"
end
# Powerful high-performance HTML view templates
using Genie.Renderer.Html
route("/html") do
h1("Welcome to Genie!") |> html
end
# JSON rendering built in
using Genie.Renderer.Json
route("/json") do
(:greeting => "Welcome to Genie!") |> json
end
# Start the app!
up(8888)
π WebSocket: Genie provides a powerful workflow for client-server communication over websockets
julia> using Genie, Genie.Router
julia> channel("/foo/bar") do
# process request
end
[WS] /foo/bar => #1 | :foo_bar
π Templating: Built-in templates support for HTML, JSON, Markdown, JavaScript views.
π Authentication: Easy to add database backed authentication for restricted area of a website.
julia> using Pkg
julia> Pkg.add("GenieAuthentication") # adding authentication plugin
julia> using GenieAuthentication
julia> GenieAuthentication.install(@__DIR__)
β° Tasks: Tasks allow you to perform various operations and hook them with crons jobs for automation
module S3DBTask
# ... hidden code
"""
Downloads S3 files to local disk.
Populate the database from CSV file
"""
function runtask()
mktempdir() do directory
@info "Path of directory" directory
# download record file
download(RECORD_URL)
# unzip file
unzip(directory)
# dump to database
dbdump(directory)
end
end
# ... more hidden code
end
$ bin/runtask S3DBTask
π¦ Plugin Ecosystem: Explore plugins built by the community such as GenieAuthentication, GenieAutoreload, GenieAuthorisation, and more
ποΈ ORM Support: Explore SearchLight a complete ORM solution for Genie, supporting Postgres, MySQL, SQLite and other adapters
function search(user_names, regions, startdate, enddate)
# ... hidden code
where_filters = SQLWhereEntity[
SQLWhereExpression("lower(user_name) IN ( $(repeat("?,", length(user_names))[1:end-1] ) )", user_names),
SQLWhereExpression("date >= ? AND date <= ?", startdate, enddate)
]
SearchLight.find(UserRecord, where_filters, order=["record.date"])
# ... more hidden code
end
Database Migrationsmodule CreateTableRecord
import SearchLight.Migrations: create_table, column, primary_key, add_index, drop_table
function up()
create_table(:record) do
[
primary_key()
column(:user_uuid, :string, limit = 100)
column(:user_name, :string, limit = 100)
column(:status, :integer, limit = 4)
column(:region, :string, limit = 20)
column(:date_of_birth, :string, limit = 100)
]
end
add_index(:record, :user_uuid)
add_index(:record, :user_name)
add_index(:record, :region)
add_index(:record, :date_of_birth)
end
function down()
drop_table(:record)
end
end
Model Validationsπ More Genie features like:
Files Uploadsroute("/", method = POST) do
if infilespayload(:yourfile)
write(filespayload(:yourfile))
stat(filename(filespayload(:yourfile)))
else
"No file uploaded"
end
end
Logging | Caching | Cookies and Sessions | Docker, Heroku, JuliaHub, etc Integrations | Genie DeployPlease contribute using GitHub Flow. Create a branch, add commits, and open a pull request.
Please read CONTRIBUTING for details on our CODE OF CONDUCT, and the process for submitting pull requests to us.
The awesome Genie logo was designed by Alvaro Casanova
Hoppscoth for readme structure template
Genie uses a multitude of packages that have been kindly contributed by the Julia community
This project is licensed under the MIT License - see the LICENSE file for details.
β If you enjoy this project please consider starring the π§ Genie.jl GitHub repo. It will help us fund our open source projects.
(top 30 of 64)
Julia
73.2%
JavaScript
26.8%