Skip to main content
Lombik icon

Lombik

Lombik is a practical scaffold engine for Flask that saves you from hours on hours of configurations, integrations and a messy project structure.

It leans heavily into a hypermedia-first approach, using Jinja2, template filters, HTMX, and Tailwind to keep logic close to the UI and reduce frontend complexity.

To get started run these 4 commands:

pip install lombik
lombik createapp my-new-app
cd my-new-app
flask run --debug

And start developing.

Structure

Lombik is organized around feature modules. Each module is a self-contained domain containing its own routes, APIs, templates, and logic. By default, you'll get 3 modules:

  • Auth
  • Admin
  • Core

Each of these modules follow the same file structure:

__init__.py

Defines the Flask blueprint used across the module.


routes.py

Defines page routes.

Routes represent full page loads and UI entry points.


queries.py

Handles data retrieval.

Typically used for database reads and returning data or partial HTML (often via HTMX).


actions.py

Handles state changes.

Used for operations that modify data such as POST, PUT, PATCH, and DELETE.


The toolkit

Inside the lombik directory you'll find the engine of the application. There is a very light test coverage by default. Custom commands to run tests:

  • lombik test Run test in the current folder, by default it shall be ran from root
  • lombik test-report Generates a coverage report in the terminal
  • lombik test-report-html Generates an HTML report about the test coverage Here some of the default behaviors are defined and yo ucan change them to your liking.

I leave it up to you to read through it and get familiar with the engine. With that said, I'd like to show some examples to display waht it's like to build with lombik.

Dates & time handling

Instead of formatting timestamps in the backend, you do it directly in the template:

{{ created_at | localtime }} → 2026-05-19 05:15
{{ created_at | onlydate }} → 2026-05-19
{{ created_at | onlytime }} → 05:15
{{ created_at | shortdatetime }} → May 19 05:15
{{ created_at | timesince }} → Just now // 2 minutes ago // 21 hours ago etc.

Everything defaults to localtime, meaning UTC from the backend is automatically shown in the user’s timezone.

Lombik expects the user’s timezone to be available via g. To change: lombik/filters/_localize.

String helpers

Make frontend less painful

{{ g.user.full_name | proper }}

john_doe → John Doe

{{ g.user.first_name | possessive }}

john → john's
lucas → lucas'

You can chain them:

{{ g.user.full_name | proper | possessive }}

john_doe → John Doe's

You can also normalize user input:

{{ user_input | normalize }}

Hello, world → hello_world email@example.com → email_example_com

In lombik, Jinja is heavily used to display UI elements and these built in template filters make it very easy and re-usable.

As an example, let's assume you have two objects:

user.name = john_doe
created_at = 2026-06-01 13:00:00

In a single line like this you can format it:

{{ user.name | proper | possessive }} response • {{ created_at | timesince }} --> John Doe's response • 21 minutes ago


Models

Create models

You can create a model for example Client by using lombik model client This creates a file called clients.py with a class CLient. The table name and filename is always plural. It also automatically injects it into the main model imports.

Create relationships

The relate command automatically generates SQLAlchemy relationships between two existing models in your Flask project.

It handles:

  • Foreign key creation
  • Relationship creation
  • Back-populates linking
  • Naming conventions
  • Duplicate prevention

lombik relate user.id to client.user_id

Creates:

  • Client.user_id → ForeignKey to User.id
  • Client.user relationship
  • User.clients reverse relationship

If fields are omitted, Lombik assumes:

user → user.id
client → client.user_id


user_id = db.Column( db.String(36), db.ForeignKey("users.id"), index=True )

user = db.relationship( "User", back_populates="clients" )


clients = db.relationship( "Client", back_populates="user", cascade="all, delete-orphan" )


  • Table names are pluralized automatically
  • Relationship names follow:
    • parent → plural(child)
    • child → singular(parent)
  • Back-populates is always synchronized between both sides

  • Existing columns are never overwritten
  • Existing relationships are never duplicated
  • Lombik only edits managed sections when available
  • Otherwise it appends safely to the class

Recommended project structure

Use these markers in your models for best results:

LOMBIK:COLUMNS

</LOMBIK:COLUMNS>

LOMBIK:RELATIONSHIPS

</LOMBIK:RELATIONSHIPS>

This ensures clean and predictable insertions.

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

lombik-3.1.0.tar.gz (31.6 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

lombik-3.1.0-py3-none-any.whl (40.6 kB view details)

Uploaded Python 3

File details

Details for the file lombik-3.1.0.tar.gz.

File metadata

  • Download URL: lombik-3.1.0.tar.gz
  • Upload date:
  • Size: 31.6 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/7.0.0 CPython/3.14.6

File hashes

Hashes for lombik-3.1.0.tar.gz
Algorithm Hash digest
SHA256 82fd22299234cc2a3ea57ad2b4a7d6b1874a969cecbe946b1915ad05b79dd447
MD5 53cdf930e732b2d3516bd7b44737f6bf
BLAKE2b-256 77942e2c1c3aca5c22bc88ca71987b1a50442d2b731ef8f8ba2150c2ea627f66

See more details on using hashes here.

File details

Details for the file lombik-3.1.0-py3-none-any.whl.

File metadata

  • Download URL: lombik-3.1.0-py3-none-any.whl
  • Upload date:
  • Size: 40.6 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/7.0.0 CPython/3.14.6

File hashes

Hashes for lombik-3.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 b4b0e00bf7625376063d25f9c03f9753aab9cc6f32c2366b947c24637a894dcc
MD5 48c6eebd6cf5000f83c6ba9ec5a7ac1b
BLAKE2b-256 0d8f701a48dd0f2a2164e7f30854767017b44ecef6828f916b078babc2100b82

See more details on using hashes here.

Release history Release notifications | RSS feed

3.2.5

2 files

3.2.4

2 files

3.2.3

2 files

3.2.2

2 files

3.2.1

2 files

3.2.0

2 files

3.1.6

2 files

3.1.5

2 files

3.1.4

2 files

3.1.3

2 files

3.1.2

2 files

3.1.1

2 files

This release

3.1.0 This release

2 files

3.0.2

2 files

3.0.0

2 files

2.0.5

2 files

2.0.4

2 files

2.0.3

2 files

2.0.2

2 files

2.0.1

2 files

2.0.0

2 files

0.2.0

2 files

0.1.7

2 files

0.1.5

2 files

0.1.4

2 files

0.1.2

2 files

0.1.1

2 files

0.1.0

2 files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page