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:
- Genie.jl: the server backend, providing features for routing, templating, authentication, and much more.
- Stipple.jl: a package for building reactive UIs with a simple and powerful low-code API in pure Julia.
- Genie Builder: a VSCode plugin for building UIs visually in a drag-and-drop editor.
- SearchLight.jl: a complete ORM solution, enabling easy database integration without writing SQL queries.
To learn more about Genie, visit the documentation, and the app gallery.
If you need help with anything, you can find us on Discord.
geniedashboard.mp4
Julia data dashboard powered by Genie. App gallery
Features of Genie.jl
π 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:
- Static, Dynamic, Named routing
- Routing parameters
- Linking routes
- Route management (Listing, Deleting, Modifying) support
- Routing methods (
GET,POST,PUT,PATCH,DELETE,OPTIONS) - and more ...
# 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
π¦ 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 Migrations
module 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 Uploads
route("/", 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 Deploy- To explore more features check Genie Documentation πββοΈπββοΈ
Contributing
Please 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.
Special Credits
-
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
License
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.