Single-binary self-hosted Markdown blog on Rust axum: no database, live search, Typst PDF export, and strong SEO.
axumblogdockermarkdownminijinjarustself-hostedtypstvite
1<div class="container mt-5">
2 <div class="row">
3 <div class="col">
4 <div class="section-label mb-2">Latest post</div>
5 </div>
6 </div>
7 <div class="row">
8 <div class="col-12 col-md-6 col-lg-5 pb-5" style="border-bottom: 1px solid rgba(255,255,255,0.06);">
9 <a href="{{ url_for('blog_post', slug=blog_post.slug) }}" class="text-decoration-none" style="color: #f0f0f5;">
10 <h2 class="fw-bolder">{{ blog_post.title }}</h2>
11 </a>
12 <div class="mb-3">
13 {% for tag in blog_post.tags %}
14 <a href="{{ url_for('blog_tag', tag=tag) }}" class="btn btn-tag btn-sm rounded-pill">
15 {{ tag|title }}
16 </a>
17 {% endfor %}
18 </div>
19 <p class="h5 text-muted mb-3" style="font-weight: 400;">{{ blog_post.description }}</p>
20 <div class="d-flex align-items-center">
21 <img class="rounded-circle me-3" src="{{ url_for('content_images', filename='avatar.webp') }}" alt="Isaac Bythewood" width="35" height="35">
22 <strong class="me-2">
23 Isaac Bythewood
24 </strong>
25 <div class="d-inline text-muted">
26 {{ blog_post.date }}
27 </div>
28 </div>
29 </div>
30 {% if blog_post.cover_image %}
31 <div class="col-12 col-md-6 col-lg-7 pb-5" style="border-bottom: 1px solid rgba(255,255,255,0.06);">
32 <a href="{{ url_for('blog_post', slug=blog_post.slug) }}">
33 <img
34 src="{{ url_for('content_images', filename=blog_post.cover_image) }}"
35 class="img-fluid rounded"
36 alt="{{ blog_post.title }}"
37 >
38 </a>
39 </div>
40 {% endif %}
41 </div>
42</div>