Future improvements, deferred items, and v2+ ideas. Roughly grouped by area, not strictly prioritized.
- Own vision model integration — Use Claude API (or similar) to generate richer image descriptions, replacing dependency on Jina's captioning.
- Alt text quality assessment — AI evaluates existing alt text; if low quality, enhance or supplement it; if good, preserve it and optionally add a secondary detailed description.
- Image filtering controls — Flags to skip decorative images (icons, avatars, logos) while keeping content images; needs careful design to avoid false positives.
- Configurable front matter — Flags to control which metadata fields are included.
- Folder collision options —
--on-conflict {fail,overwrite,suffix}flag. Default changes tosuffix(timestamp-based) in a future version. - Batch processing — Accept multiple URLs or a file of URLs.
- Pluggable content extraction — Swap Jina for percollate, readability-cli, or other backends via a
--providerflag. - Clickable output path — Print the full absolute path to the output folder so terminal emulators render it as a clickable link (e.g.,
file:///home/user/articles/...or just the absolute path). - Interactive mode — A guided "hand-holding" mode that prompts the user for URL, output directory, overwrite preference, etc. step by step instead of requiring CLI arguments. Could be the default when
ohmdis run with no arguments (instead of printing help). Pairs well with persistent config ("save these as defaults?"). - Persistent config file — User config at
~/.config/ohmd/config.toml(or platform-appropriate location) for default output directory, API key, force behavior, and other settings. CLI args override config, config overrides built-in defaults. - CLI UI improvements —
--verboseand--quietflags, progress bars, color output viarich. - MCP server / Claude Code skill — Expose as a tool that AI agents can invoke directly.
- Offline / self-hosted mode — Use self-hosted Jina or local Readability.js pipeline with no external API calls.
- Shared SSRF validation helper — Extract
is_private_host()fromcli.validate_urlandimages._is_private_urlinto a common module to prevent drift between the two implementations. - Non-destructive log redaction —
RedactionFiltercurrently mutatesrecord.msgin place; store redacted output in a custom attribute so handlers without the filter still see the original message. - Logging test isolation — Add an autouse pytest fixture that calls
shutdown_logging()after each test to prevent cross-test handler contamination from the module-level globals.
- CLI exit code integration test — Test
main()end-to-end with invalid URLs and assert the actual exit code (currently only unit-tested viavalidate_url). _safe_getredirect hop counting test — Test with actual 302 responses viaresponseslibrary instead of mockingSession.getdirectly, to exercise the full redirect-counting loop.
- Alt text architecture (v2): When existing alt text is present, should AI descriptions replace it, supplement it, or be added as a separate field? Needs more design work. Initial thinking: preserve original, add AI description as a secondary field if the original is substantive; replace if the original is empty/generic.
- Image format handling (post-v1): Should very large images be optionally compressed? Should WebP be converted to PNG/JPG for wider compatibility? TBD based on real-world usage.
- HTML
<img>support: Should this be promoted from best-effort to fully supported in a future version? Depends on how often Jina emits<img>tags in practice.