Skip to content

Configuration

Inkfeed is configured via a single TOML file. By default, it looks for config.toml in the current directory.

General Settings

[general]
output_dir = "output"          # Where archived content is saved
embed_assets = true            # Embed images inline (base64)
output_formats = ["html", "md", "gemtext", "epub", "sleepscreen"]
max_workers = 8                # Concurrent download threads
max_retries = 3                # Retry count for failed requests

output_dir

Path to the output directory (relative to where you run Inkfeed). Created automatically if it doesn't exist.

embed_assets

When true, images are downloaded and embedded directly in the output files. This makes each file fully self-contained but increases file size.

output_formats

List of output formats to generate. Available formats:

Format Extension Description
html .html Rich HTML with embedded styles
md .md Clean Markdown
gemtext .gmi Gemini protocol format
epub .epub E-book format
sleepscreen .html E-ink optimized HTML for always-on displays

max_workers

Number of concurrent threads for downloading articles and images. Higher values are faster but use more bandwidth.

max_retries

How many times to retry a failed HTTP request before giving up.

Sleepscreen Settings

[sleepscreen]
width = 480                   # Render width in pixels
height = 800                  # Render height in pixels
spotlight_count = 2           # Number of featured articles
max_headlines_per_card = 10   # Headlines per category card
max_excerpt_chars = 350       # Max chars for article excerpts

The Sleepscreen format generates static images designed for the Xteink X4 e-ink display's sleep screen feature. It renders HTML pages in a headless browser and captures screenshots as 8-bit grayscale images.

Other e-ink devices may also work if they support:

  • Cycling through multiple sleep screen image files in a folder
  • 8-bit grayscale images with more than 4 levels of gray

Screen LUT configuration is not yet supported, but since Sleepscreen output is primarily text-based, the default LUT should produce acceptable results.

Source Configuration

Each source is defined under [sources.<name>]. The <name> is a unique identifier used internally.

Common Source Fields

[sources.example]
type = "rss"                  # Source type: "api" or "rss"
display_name = "Example Feed" # Human-readable name
frequency = "daily"           # Fetch frequency
enabled = true                # Set to false to skip

API Sources

API sources use built-in archivers. Currently supported:

RSS Sources

Any RSS or Atom feed can be added:

[sources.my_feed]
type = "rss"
display_name = "My Favorite Blog"
frequency = "daily"
enabled = true
url = "https://example.com/rss.xml"
max_articles = 30
include_article_content = true

See RSS source docs for all options.

Full Example

[general]
output_dir = "output"
embed_assets = true
output_formats = ["html", "md", "gemtext", "epub", "sleepscreen"]
max_workers = 8
max_retries = 3

[sleepscreen]
width = 480
height = 800
spotlight_count = 2
max_headlines_per_card = 10
max_excerpt_chars = 350

[sources.hackernews]
type = "api"
display_name = "Hacker News"
frequency = "daily"
enabled = true
top_stories = 30
include_comments = true
max_comment_depth = 3
max_comments_per_level = 10
include_article_content = true

[sources.kaginews]
type = "api"
display_name = "Kagi News"
frequency = "daily"
enabled = true
language = "en"
max_stories_per_category = 50
categories = [
    "south_korea", "usa", "world",
    "business", "tech", "science",
    "sports", "gaming",
]

[sources.hackaday]
type = "rss"
display_name = "Hackaday"
frequency = "daily"
enabled = true
url = "http://www.hackaday.com/rss.xml"
max_articles = 30
include_article_content = true

[sources.engadget]
type = "rss"
display_name = "Engadget"
frequency = "daily"
enabled = true
url = "https://www.engadget.com/rss.xml"
max_articles = 30
include_article_content = true