Skip to main content

A minimalistic, self-hosted, statically rendered, micro-blogging engine.

Project description

readthememo

A minimalistic, self-hosted, statically rendered, micro-blogging engine.

Overview

readthememo (command: memos) is a simple tool that transforms memos into static HTML pages. It's designed for quick, low-friction publishing of short-form content without the complexity of traditional blogging platforms.

Features

  • Minimal dependencies: Built with Python 3.11+ using only Jinja2, marko, and tyro
  • Static output: Generates clean, standalone HTML files
  • CommonMark (markdown) input: Write your content in a simple, readable format
  • LogSeq-ready: Directory format works seamlessly with LogSeq
  • Responsive design: Uses Pico CSS for clean, semantic styling
  • CLI interface: Simple command-line tool for building your site
  • Self-contained: No database or server requirements

Installation

Install from source:

git clone https://git.sr.ht/~docbibi/memos/
cd memos
python3 -mvenv .venv
. ./.venv/bin/activate
pip install -e .

Or install development dependencies:

pip install -e .[dev]

Usage

Basic Usage

Build HTML from a single CommonMark file:

memos path/to/your/memos.md output.html

Build HTML from a directory with CommonMark files:

memos path/to/your/memos/ output.html

Standard Input/Output

Read from stdin and write to stdout:

cat memos.md | memos > output.html

CommonMark Format

site.yaml:

---
title: "My Blog Title"
author: "Your Name"
headline: "My Blog"
moto:
  - "A description of your blog"
  - "by Your Name"
---

2025-01-01.md:

## My First Memo #InterstingTopic

This is the content of my first memo.
It can contain HTML tags and multiple paragraphs.

2025-01-02.md:

- ## Hello from LogSeq
    - This memo is bullet point heavy, as can be seen when reading raw content from a LogSeq journal.
    - The feature is similar, except that the first two levels of bullet points will be stripped by the parser to
      streamline the structure.

Key features:

  • Natural prose: Write directly in markdown without TOML strings
  • LogSeq compatible: Use YYYY-MM-DD.md or YYYY_MM_DD.md naming; strip the first level of bullet-points
  • Multiple articles per day: Separate with --- horizontal rules
  • Tag extraction: Add tags to titles using #tag format
  • HTML support: Embed HTML directly in markdown content

Alternative: Single File with YAML Frontmatter

You can also use a single CommonMark file with YAML frontmatter:

---
title: "My Blog Title"
author: "Your Name"
headline: "My Blog"
moto:
  - "A description of your blog"
  - "by Your Name"
---

# 2025-01-01

## My First Memo

This is the content of my first memo.
It can contain HTML tags and multiple paragraphs.

# 2025-01-02

## Another Memo #tech #thoughts

This memo has tags listed after the title.

This format is useful for smaller blogs or when you prefer to keep everything in one file.

LogSeq Integration

The directory structure is designed to work seamlessly with LogSeq:

  1. Set up LogSeq graph:

    # Your memos directory becomes a LogSeq graph
    # LogSeq will automatically detect the markdown files
    
  2. File naming compatibility:

    • LogSeq uses YYYY_MM_DD.md format by default (underscores), but will happily use files named using hyphens ( YYYY-MM-DD.md)
    • readthememo supports both YYYY-MM-DD.md and YYYY_MM_DD.md
  3. LogSeq workflow:

    • Open your memos directory as a LogSeq graph
    • Create daily notes using LogSeq's journal feature
    • Use ## Title #tag format for your memo titles
    • Write content underneath (nested)
    • Repeat for other articles on the same day
  4. Publishing workflow:

    # Edit in LogSeq, then publish
    memos path/to/logseq-graph/ > output.html
    
  5. LogSeq features that work:

    • Daily notes: Perfect for memo-style content
    • Tags: Use #tag in titles for automatic tag extraction
    • Block references: Can be used within memo content
    • Linked references: Work normally within LogSeq
  6. What gets published:

    • Only files matching YYYY-MM-DD.md or YYYY_MM_DD.md patterns
    • Other LogSeq files (config, assets, etc.) are ignored
    • Content is processed as standard markdown with HTML passthrough

Project Structure

├── src/readthememo/        # Main application code
│   ├── cli.py              # Command-line interface
│   ├── core.py             # Core parsing and rendering logic
│   └── templates.py        # Template environment setup
├── src/templates/          # Jinja2 HTML templates
├── static/                 # CSS and static assets
├── tests/                  # Test suite
├── docs/decisions/         # Architecture Decision Records
└── memos/                  # Example memos documenting this project itself

Development

You will need uv, install it first through your method of choice. For example with pipx:

pipx install uv

Running Tests

uv run pytest

Code Quality

The project uses ruff for linting and formatting:

uv run ruff check
uv run ruff format

Pre-commit Hooks

Set up pre-commit hooks:

uv run pre-commit install

Architecture

This project follows a functional core, imperative shell architecture:

  • Core: Pure functions for parsing TOML and rendering HTML
  • Shell: CLI interface and I/O operations
  • Templates: Jinja2 templates for HTML generation

See docs/decisions/ for detailed architecture decisions.

Requirements

  • Python 3.11 or higher
  • Jinja2 3.1.6+
  • tyro 0.9.26+

License

GPL-3.0-or-later

Contributing

  1. Check existing Architecture Decision Records in docs/decisions/
  2. Follow the functional core, imperative shell pattern
  3. Write tests for new functionality
  4. Ensure code passes ruff linting
  5. Update documentation as needed

Examples

See the memos/ directory for this very repository memos; with site.toml configuration and date-based .md files.

Also take a look at the test files (.md) in tests/cases/ for single-file examples.

Project details


Download files

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

Source Distribution

readthememo-2025.6.tar.gz (22.5 kB view details)

Uploaded Source

Built Distribution

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

readthememo-2025.6-py3-none-any.whl (21.5 kB view details)

Uploaded Python 3

File details

Details for the file readthememo-2025.6.tar.gz.

File metadata

  • Download URL: readthememo-2025.6.tar.gz
  • Upload date:
  • Size: 22.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: python-requests/2.32.4

File hashes

Hashes for readthememo-2025.6.tar.gz
Algorithm Hash digest
SHA256 b33895569bb16c98c0ae9f3c5a14a7ff0444549f0a1b76fc905f68069cb7a1a9
MD5 c4625a33ff5072e2d7fbe486a0863ef9
BLAKE2b-256 319f69b2d09a189937eeca1193e8ac7323f9afc8d21302038a9b457d833d4781

See more details on using hashes here.

File details

Details for the file readthememo-2025.6-py3-none-any.whl.

File metadata

  • Download URL: readthememo-2025.6-py3-none-any.whl
  • Upload date:
  • Size: 21.5 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: python-requests/2.32.4

File hashes

Hashes for readthememo-2025.6-py3-none-any.whl
Algorithm Hash digest
SHA256 d2c6fe78c7b27719fd021263284d745ff74d87758bc6ce9b8b020fc6286ca6d2
MD5 16358903998506baae075fc9e28e21bc
BLAKE2b-256 3b9ad3136325f5adf05d15080ef24002311a1cabde4923313d1e769901a484ef

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page