Highly productive web development with Julia

Genie Framework includes all you need to quickly build production-ready web applications with Julia. Develop Julia backends, create beautiful web UIs, build data applications and dashboards, integrate with databases and set up high-performance web services and APIs.

Genie Framework environment

Our users work at amazing organizations

 Build & deploy your Julia web apps with

GenieCloud (Private Beta)

Genie Cloud is a no-code platform to quickly build and deploy web apps around your Julia code. All without worrying about frontend code, server stack, or hosting.

Genie

logo Genie.jl

Genie.jl is the backbone of Genie Framework: the complete solution for developing modern full-stack web applications in Julia. Genie.jl includes key features like the webserver, the flexible templating engine with support for HTML, JSON, Markdown, and Julia views, caching, (encrypted) cookies and sessions, forms handling, and the powerful router. Genie.jl uses the familiar MVC architecture, follows industry best practices, and comes with lots of useful code generators to get you started!

# 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)

Genie plugins Genie plugins

Genie.jl can be extended to provide even more features by adding official and community contributed plugins. Some of the most popular plugins add functionalities like authentication and authorisation, or web pages auto-reload during development.

Simple but effective database-backed authentication plugin for Genie.jl.

It includes all the functionality for registering new accounts and logging in users. Its views can be customised as needed and authentication logic can be applied anywhere in the code (routes, models, views, controllers).

Role-based Authorisation (RBA) plugin for Genie.jl.

GenieAuthorisation.jl implements a flexible and robust database-backed authorisation framework that employs roles and permissions to determine and enforce the level of user access to designated app features. Authorisation logic can be applied anywhere in the code (routes, models, views, controllers).

#Implement authorisation at route level
route("/admin/users/delete/:id") do; @authorised!(:admin)
    delete(User, params(:id))
end

# Authorisation check in views
<% if has_role(current_user(), :admin) ||
    has_permission(current_user(), :delete) %>
    <a class="btn" href="/admin/users/delete/42">Delete user</a>
<% end %>

GenieAutoReload.jl speeds up and streamlines your Genie Framework app development by automatically monitoring your application files for changes (for example when editing and saving your code).

When changes are detected, the auto reload plugin automatically refreshes all of your application's web pages that are opened in the browser – so you don't have to.

SwagUI and SwaggerMarkdown simplify API development with the Swagger open source. These packages, as part of GenieFramework, help users, teams and enterprises to design, develop, document, test and monitor APIs.

SwagUI package auto-generates Swagger UI based on swagger.json. The generated API documentation can be served as an endpoint using Genie.jl. SwaggerMarkdown builds the swagger document from markdown comments in the code.

using Genie, Genie.Router, Genie.Renderers.Json
using SwagUI, SwaggerMarkdown

swagger"""
/doge:
get:
    description: Doge🐕 to the moon!
    responses:
    '200':
        description: Returns a doge.
"""
route("/doge") do 
    Json.json("Doge to the moon!!")
end

rs() = render_swagger(
build(
    OpenAPI("3.0", Dict("title" => "Store API", "version" => "1.0.5")),
),
options = Options(
    custom_favicon = "/favicon.ico",
    custom_site_title = "Pet Store",
    show_explorer = false
)
)

route("/docs", rs)

up(8001, async = false)

Stipple

Stipple

Stipple is the UI library for building interactive data applications in Julia. Stipple helps Julia developers quickly and easily create interactive data dashboards and data-centric applications, as well as web-based user interfaces for Julia software. Stipple offers a large collection of user interface elements (such as inputs, buttons, sliders, tabs, data tables, responsive layouts, and many more) and powerful plotting capabilities.

heading("What's your number?")

# set up user input
textfield("Write your number and see if others dig it too",
            :choice, @on("keyup.enter", "process = true"),
            clearable = true, filled = true,
            errormessage = :errormessage,
            error = :error)

h6("Numbers distribution")

# plot it
plot(:data, layout = :layout, config = :config,
     style="margin-top: -10pt;")

stipple pluggins Stipple plugins

Stipple can be extended to include any UI features you could think of: from 3D rendering, to slides and spreadsheets, to powerful diagrams editors, there are no limits to what can be built on top of Stipple!

StippleUI provides a collection of over 25 professional (web) UI elements, ready to implement in your Julia app!

Ranging from the fundamentals like inputs, sliders, buttons, lists, toggles and knobs, to great-looking cards, badges, tabs, drawers, menus, and loaders, and to the super-powerful data tables, text editors, and lazy content loaders (and many others!).

StippleCharts is a feature-rich plotting library for Stipple built upon the powerful ApexCharts.js.

With a simple API, a multitude of chart types, and a multitude of customisation options, StippleCharts is a great alternative to StipplePlotly if you're looking for lighter plotting with great visuals!

Stipple Chart demo
Stipple Chart demo

StipplePlotly.jl is a powerful and easy way to use a charting plugin for Stipple, based on the well-known Plotly JavaScript library.

Stipple makes it a breeze to combine Plotly charts with other UI elements, typography and responsive layouts, in order to create professional data visualisations.

SearchLight

SearchLight

SearchLight is a complete ORM solution for Julia, supporting Postgres, MySQL and SQLite (ODBC and JDBC support coming soon). SearchLight offers a complete range of features, that go beyond query generation, including database schema versioning through migrations, model validators, data serializers, model relationships, transactions support and much more. SearchLight greatly simplifies the task of working with databases through its portable, concise and readable Julia API.

Base.@kwdef mutable struct User <: AbstractModel
    id::DbId = DbId()
    username::String = ""
    password::String = ""
end

Validation.validator(::Type{User}) = ModelValidator([
    ValidationRule(:username, UsersValidator.not_empty),
    ValidationRule(:username, UsersValidator.unique),
    ValidationRule(:password, UsersValidator.not_empty)
])

function register()
    User(username  = params(:username),
         password  = params(:password) |> hash_password,
         name      = params(:name),
         email     = params(:email)
    ) |> save!
end

Blog

How to quickly turn your Julia code into a web app with Genie Builder

Tutorials

How to quickly turn your Julia code into a web app with Genie Builder

December 14, 2022

This tutorial will show you how to quickly turn your data analysis Julia code into a web app using Genie Builder.

Read the article
Genie Builder v0.2

Product Update

Genie Builder v0.2: speed up your Julia app development

November 22, 2022

Genie Builder v0.2 speeds up your Julia app development with a more productive API and an improved no-code editor to build UIs in no time.

Read the article
How to build a data app with a CSV file uploader

Tutorials

How to build a data app with a CSV file uploader

October 17, 2022

In this tutorial, we build a simple data app that lets us upload CSV files and visualize the data distribution for exploratory analysis.

Read the article