{"id":51239718,"url":"https://github.com/skvggor/acag","last_synced_at":"2026-06-28T23:30:55.753Z","repository":{"id":365491526,"uuid":"1271277065","full_name":"skvggor/acag","owner":"skvggor","description":"A native desktop app that generates article cover art in an Omakase / Japanese-constructivist style — five aspect ratios (square, link, wide, portrait, banner), six themes, five patterns, three layouts, a live preview, exported up to 4K PNG (plus the source SVG).","archived":false,"fork":false,"pushed_at":"2026-06-17T15:35:44.000Z","size":2680,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-06-17T16:50:59.413Z","etag":null,"topics":["2k","4k","acag","articles","blog","design","dev","devto","graphic-design","hyprland","instagram","linkedin","linux","native","native-linux","og-image","omarchy","post","rust","rust-lang"],"latest_commit_sha":null,"homepage":"","language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/skvggor.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-06-16T14:00:20.000Z","updated_at":"2026-06-17T15:37:21.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/skvggor/acag","commit_stats":null,"previous_names":["skvggor/acag"],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/skvggor/acag","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/skvggor%2Facag","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/skvggor%2Facag/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/skvggor%2Facag/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/skvggor%2Facag/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/skvggor","download_url":"https://codeload.github.com/skvggor/acag/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/skvggor%2Facag/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34907985,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-28T02:00:05.809Z","response_time":54,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["2k","4k","acag","articles","blog","design","dev","devto","graphic-design","hyprland","instagram","linkedin","linux","native","native-linux","og-image","omarchy","post","rust","rust-lang"],"created_at":"2026-06-28T23:30:55.130Z","updated_at":"2026-06-28T23:30:55.745Z","avatar_url":"https://github.com/skvggor.png","language":"Rust","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cp align=\"center\"\u003e\n  \u003cimg src=\"assets/icons/icon-256.png\" width=\"120\" alt=\"acag icon\" /\u003e\n\u003c/p\u003e\n\n\u003ch1 align=\"center\"\u003eacag\u003c/h1\u003e\n\n\u003cp align=\"center\"\u003e\u003cem\u003earticle cover art generator\u003c/em\u003e\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  A native desktop app that generates \u003cstrong\u003earticle cover art\u003c/strong\u003e in an\n  \u003cstrong\u003eOmakase / Japanese-constructivist\u003c/strong\u003e style: \u003cstrong\u003efive aspect ratios\u003c/strong\u003e\n  (square, link, wide, portrait, banner), six themes, five patterns, three layouts, a live\n  preview, exported up to \u003cstrong\u003e4K PNG\u003c/strong\u003e (plus the source SVG).\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"docs/screenshot.png\" width=\"92%\" alt=\"the acag app: controls on the left, live preview on the right\" /\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"docs/samples/0-terracotta-editorial.png\" width=\"32%\" alt=\"editorial layout, terracotta theme\" /\u003e\n  \u003cimg src=\"docs/samples/1-sumi-bloco.png\" width=\"32%\" alt=\"bloco layout, sumi theme\" /\u003e\n  \u003cimg src=\"docs/samples/2-ai-ma.png\" width=\"32%\" alt=\"ma layout, ai theme\" /\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"docs/samples/social-link.png\" width=\"74%\" alt=\"a 1.91:1 link / Open Graph cover, the format LinkedIn and other platforms use for shared articles\" /\u003e\n\u003c/p\u003e\n\n## The idea\n\nBuilt around **Omakase** (お任せ, \"I leave it to you\", the sushi chef's choice) and the\ngeometry of traditional Japanese patterns (**wagara**, 和柄), tempered with bold,\nstructural, constructivist typography. The result is calm but assertive: a huge\n**Montserrat Black** title, a lot of **Ma** (negative space), and a quiet wave \"seal\".\n\nThe Japanese identity comes **only from geometry and color**; there are deliberately\n**no Japanese glyphs in the artwork**. It shares its design language (themes, wagara,\nthe sumi-ê palette) with [skvggor.dev](https://skvggor.dev) and\n[`waka-readme`](https://github.com/skvggor/waka-readme).\n\n## Features\n\n- **6 sumi-ê themes**: `terracotta` 赤土 · `sumi` 墨 · `matcha` 抹茶 · `washi` 和紙 · `ai` 藍 · `sakura` 桜\n- **5 wagara patterns**: `seigaiha` (waves) · `shippo` (interlocking circles) · `kikko`\n  (tortoiseshell) · `yabane` (arrow feathers) · `asanoha` (hemp leaf)\n- **3 layouts**: `editorial` (asymmetric), `bloco` (constructivist color block), `ma` (negative space)\n- **5 formats**: `1:1` square, `1.91:1` link/Open Graph (LinkedIn, Facebook, X, Slack),\n  `16:9` wide (native LinkedIn article, YouTube), `4:5` portrait, `2:1` banner; the layouts\n  adapt to each ratio\n- **Live preview**: every control updates the preview instantly\n- **Adjustable film grain** and **pattern strength** sliders, shown live in the preview\n- **Omakase button**: randomizes the visual style and lets the house plate it for you\n- **Named presets**: save any number of looks as TOML and load/delete any of them (`~/.config/article-cover-art-generator/presets/` on Linux, `%APPDATA%\\article-cover-art-generator\\presets\\` on Windows)\n- **WCAG AAA**: all readable text is forced to ≥ 7:1 contrast against its background\n- **Montserrat** Black / Bold / Regular, embedded in the binary (no system fonts needed)\n- **Export**: **2K or 4K** (longest edge) PNG at each format's exact dimensions, plus the\n  resolution-independent source SVG; a non-blocking save (spinner while it rasterizes) and\n  optional open-after-export\n- **Native**: Rust + [slint](https://slint.dev) + [resvg](https://github.com/linebender/resvg),\n  running directly on Wayland (no web view, no Node)\n\nOnly the **title** is required; category, date, number and brand are optional, keeping the\ncover generic enough for any platform (blog, dev.to, LinkedIn, X, OG image, thumbnail…).\n\n## Download\n\nPrebuilt binaries are attached to each [GitHub release](https://github.com/skvggor/acag/releases). No Rust toolchain or system dependencies required.\n\n- **Linux**: `acag-*-x86_64.AppImage` (self-contained: `chmod +x` and run), or `acag-*-linux-x86_64.tar.gz` (raw binary).\n- **Windows**: `acag-*-windows-x86_64.zip` (standalone `acag.exe`, no Visual C++ runtime needed).\n\n### Rendering backend\n\nBy default the app uses Slint's **software (CPU) renderer**, so it runs everywhere,\nincluding headless VMs and RDP sessions without a usable OpenGL driver. For this\nform-plus-preview UI the difference is imperceptible. To opt into GPU rendering:\n\n```sh\nSLINT_BACKEND=winit-femtovg acag\n```\n\n## Build from source\n\nRequires a recent stable Rust toolchain. On Linux, Slint also needs a few system\nlibraries for the windowing/build:\n\n```sh\n# Debian / Ubuntu\nsudo apt install build-essential pkg-config \\\n  libxkbcommon-dev libwayland-dev wayland-protocols \\\n  libxcb1-dev libxcb-render0-dev libxcb-shape0-dev libxcb-xfixes0-dev \\\n  libfontconfig1-dev libgl1-mesa-dev\n```\n\n```sh\n# Arch Linux\nsudo pacman -S --needed base-devel \\\n  libxkbcommon wayland wayland-protocols \\\n  libxcb fontconfig mesa\n```\n\n```sh\ncargo run --release\n```\n\nCovers are saved to `~/Pictures/article-covers/` on Linux and\n`%USERPROFILE%\\Pictures\\article-covers\\` on Windows (named from the title). Set\n`ACAG_OUTPUT_DIR` to write them somewhere else.\n\n### Install on Omarchy / Hyprland\n\n```sh\ncargo build --release\ninstall -Dm755 target/release/acag ~/.local/bin/acag\ninstall -Dm644 assets/icons/icon-512.png \\\n  ~/.local/share/icons/hicolor/512x512/apps/article-cover-art-generator.png\ninstall -Dm644 assets/article-cover-art-generator.desktop \\\n  ~/.local/share/applications/article-cover-art-generator.desktop\n```\n\nIt will then show up in the app launcher (walker/rofi). Run it from a terminal with `acag`.\n\n## Usage\n\n1. Type a **title** (the only required field).\n2. Fill in optional **category / date / number / brand**.\n3. Pick a **theme**, **pattern**, **layout** and **format** (1:1 … 2:1); tune the **pattern strength** and **film grain** sliders.\n4. Hit **Omakase** to shuffle the style, or set it by hand; name and **Save** a preset, then **Load** or **Delete** any saved one.\n5. Choose **2K or 4K**, then **Export PNG** or **Export SVG** (enable *Open after export* to view it).\n\n## How it works\n\nA single pure function, `render_cover_svg(\u0026CoverConfig) -\u003e String`, is the source of truth.\nThe live preview and both exports rasterize **the same SVG** with resvg/tiny-skia, so the\npreview is exactly the file you get. Titles are auto-wrapped and auto-sized using the real\nMontserrat glyph metrics (`ttf-parser`).\n\n```\nsrc/\n  design/   themes · wagara patterns · WCAG contrast\n  cover/    config · format (aspect ratios) · typesetting · render · layouts\n  raster.rs SVG → Pixmap/PNG by longest edge (resvg + embedded Montserrat)\n  export.rs save SVG / PNG (2K or 4K)\n  preset.rs save/load named presets as TOML\n  main.rs   slint GUI wiring (background export + spinner)\nui/app.slint  the editor + live preview\n```\n\n## Development\n\n```sh\ncargo test                 # unit tests\ncargo run --example gallery  # regenerate docs/samples\ncargo run --example icon     # regenerate the app icon\n```\n\n## Credits\n\n- **Montserrat** by Julieta Ulanovsky et al., under the [SIL Open Font License](https://github.com/JulietaUla/Montserrat).\n- **resvg / tiny-skia** and **slint** for native rendering and UI.\n- Design language shared with [skvggor.dev](https://skvggor.dev) and `waka-readme`.\n\n## License\n\n[MIT](LICENSE).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fskvggor%2Facag","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fskvggor%2Facag","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fskvggor%2Facag/lists"}