Skip to content
AlxWolfenstein97Public

About

Style menu TTY/console fonts with PSF mockups. Not broken — read README to arm Style menu after install.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Repository files navigation

OmaTTY

Omarchy themes your desktop. OmaTTY picks the console font behind Ctrl+Alt+F3 — real PSF mockups in the Style menu, then FONT= in /etc/vconsole.conf.

OmaTTY — Terminus 32 Bold mockup, hilariously cropped like a real TTY

Built first for accessibility — low vision, a mostly-blind bastard who still wants a usable virtual console, HiDPI / 1440p+ glass where default8x16 is squint-land, and reading kernel logs on Ctrl+Alt+F3 after the desktop has gone away. Big fat Terminus clamps whip the TTY like a proper bitmap console.

GPU passthrough / vm-curator: when the card returns from a VM, fbcon often resets to a tiny default before SDDM. systemd-vconsole-setup frequently skips busy VTs (“All allocated virtual consoles are busy”). OmaTTY’s DRM card* udev rule re-runs setfont from your FONT= on the active VT (plus best-effort setfont -C on tty1–N — no chvt). That keeps SDDM’s login VT alone so the greeter still works after a hop. Family arm-all-family.sh installs that udev (--with-drm-reapply); family wipe / uninstall.sh --yes remove it.

Observed on host after a few reboots and passthrough hops: every getty ends up fat and SDDM still comes up — the active poke plus -C attempts are enough in practice; a chvt sweep is not worth breaking the login path. Other VTs may look small for a beat right after modeset; after settle / a visit / the next boot they match. After a normal reboot, vconsole.conf makes them all large from the start.

Opt-in only with the greeter stopped (nested VM / console-only tests): omatty reapply --all-vts or OMATTY_REAPPLY_ALL=1 (refused if SDDM / a graphical session is up). Style → TTY Fonts / plain omatty reapply stay SDDM-safe. Brief tiny flash mid-modeset is still possible.

Pairing: OmaVT can retint the console palette live when you hop to a TTY (kernel vt.default_* via a limine-entry-tool drop-in — apply is a bit slow because it rebuilds Limine entries for the next cold boot as well). Fat face here, theme colours there.

Stock Omarchy never sets a console font. Recent archinstall builds expose a Console font locales menu that lists every *.gz under /usr/share/kbd/consolefonts (default default8x16, and Terminus when terminus-font is around). Dumping that whole list into Style would be hundreds of codepage relics and a uselessly huge carousel.

OmaTTY keeps a curated Terminus-first set, pulls terminus-font on install so every tile is a real mockup (no “pick blind, install later” dance), and applies with sudo the same way Style → Unlock / Boot Themes do.

Goals (and honest limits)

These Style plugins extend Omarchy’s theme system without requiring theme authors — or you — to ship anything extra. Fonts come from packages on the machine (kbd, terminus-font); themes are not asked for font assets. The broader “theme every surface that accepts colour data” story and stop-line live in Chroma.

Goal What that means here
Zero extra theme assets No per-theme font previews. Glyphs come from installed PSF files.
Extreme compatibility Works beside any Omarchy theme; pairs with OmaVT for palette.
Closest-to-real mockups Actual PSF bitmaps on a top-left getty session (same script as OmaVT). Still not a live /dev/tty capture.
Carousel-safe Mockups are 1536×864 with ~8% side inset. Session stays top-left inside that margin; bigger faces crop mid-command like a real framebuffer.
Curated, not exhaustive archinstall lists every console font; Style keeps a Terminus-first set so the picker stays usable.
Snappy pickers Mockups warm in parallel across CPU cores and skip tiles whose font / layout haven’t changed — reopen is near-instant. On par with Omarchy’s stock Style carousels.

Why a Style picker for fonts?

Fonts are not theme colours — you are choosing a face/size, not syncing colors.toml. The carousel still earns its keep the same way the theme plugins do: mockups let you compare Terminus sizes across the curated set faster than applying each one and hopping to Ctrl+Alt+F3. Pair with OmaVT when you want the TTY palette to match the desktop too.

What you get

  • Style → TTY Fonts — labelled image picker (omarchy-menu-images).
  • Real PSF mockups — top-left getty session painted with the font's own glyphs (not a lookalike TTF), so sizes read true before you apply.
  • Cropped like a TTY, not Hyprland — fixed “glass”; bigger faces fit fewer columns/rows and crop the content. That is 1970s zoom (same framebuffer, hungrier cells), not compositor zoom that keeps layout and shrinks the viewport. Side effects on TUIs are real — fewer cells is fewer cells — and the mockup shows that on purpose (watch the passthrough path get eaten).
  • Every ter-v* weight the package ships — 12–32, normal and bold (no ter-v12b upstream). terminus-font is installed up front.
  • Safe vconsole.conf patch — only FONT= (inside # omatty markers). KEYMAP / XKB stay untouched.
  • TTY-safe Starship — Omarchy’s desktop prompt glyphs will tofu on a bitmap console; OmaTTY ships a parallel profile for real /dev/tty* only.

Mockups: shared session with OmaVT (real PSF paint)

Same getty script as OmaVT — banner, wolf login, ~ > sudo …/single-gpu-start.sh — but every cell is a real console glyph from the PSF you are picking. Layout from a QEMU default-TTY capture (nested Omarchy, SDDM off → tty1; no GPU passthrough so F-keys stay on the host). Paint stays on the stock VGA Default palette so the carousel compares faces, not themes — OmaVT owns colors.toml → VT colour.

Compare — real default TTY vs default8x16 mockup (same face, VGA Default):

Real getty (QEMU, stock default8x16 / tty1) OmaTTY mockup (default8x16)
Real Omarchy TTY on tty1 — QEMU reference OmaTTY default8x16 — same session, real PSF glyphs

Hero at the top is the same session on Terminus 32 Bold — the face the carousel is selling for HiDPI glass (watch the path get eaten).

Starship on a real TTY

Omarchy’s starship.toml is lovely under Nerd Fonts in Alacritty / Kitty / Ghostty. On a PSF console those same glyphs are missing codepoints — tofu blocks instead of a prompt:

Desktop (Omarchy default) TTY profile
❯ success / ✗ error > / x
…/ truncation .../
⇡ ⇣ ⇕ git ahead/behind/diverged ^ v <>
Nerd icons ( ) ! = *

OmaTTY writes ~/.config/omarchy/omatty/starship-tty.toml and a marked block in ~/.bashrc that sets STARSHIP_CONFIG only when tty reports /dev/tty* (Ctrl+Alt+F3 style). Graphical terminals keep the fancy profile. Your Wayland session is untouched; the clamp only hits the virtual console.

Marketplace consent (hooks & Style menu)

Installing the plugin only drops the code. Style menu rows and theme-set hooks edit your Omarchy config, so they stay opt-in.

Fast path (no prompts) — from your home folder:

~/.config/omarchy/plugins/io.github.alxwolfenstein97.omatty/install.sh --yes

--yes means: I consent — arm everything this plugin supports, skip Y/n. Interactive ./install.sh (no --yes) still asks — Workshop-safe; --yes / arm-all are optional shortcuts. Style menu helper: ./tools/install-style-menu.sh --yes.

Arm the whole family in one shot (arms only what’s already installed — omit any plugin add you don’t want):

~/.config/omarchy/plugins/io.github.alxwolfenstein97.chroma/tools/arm-all-family.sh

Full wipe (this plugin) — same ease as install.sh --yes (full teardown + plugin remove; ledger-only pkg drop — only packages this install recorded pulling; pre-existing deps stay; drop may fail and the package stays if something else still needs it — e.g. you installed Goverlay after we pulled Pillow — that’s fine):

~/.config/omarchy/plugins/io.github.alxwolfenstein97.omatty/uninstall.sh --yes

Wipe the whole family (runs each plugin’s uninstall.sh --yes — same full teardown as a single-plugin wipe; ledger-only pkg drops, no blanket shared-dep sweep — drop may fail and stay if something else still requires the package):

~/.config/omarchy/plugins/io.github.alxwolfenstein97.chroma/tools/wipe-all-family.sh
# optional OCD: add --purge-tombstones (see Tombstones below)

Tombstones (after wipe)

Harmless sticky note at ~/.local/state/omarchy/<plugin>/uninstalled. The next install (quiet or loud) uses it to clear same-session /run package-prompt stamps / shared Pillow claims, then deletes the note. Logout/reboot clears those stamps anyway. Style stays off after wipe because armed state is gone — not because of the stone. Normal boom-out → loud boom-in (arm-all) does not need --purge-tombstones.

Optional OCD wipe of the notes themselves:

~/.config/omarchy/plugins/io.github.alxwolfenstein97.chroma/tools/wipe-all-family.sh --purge-tombstones

Interactive ./install.sh still asks [Y/n] if you prefer. Quiet shell restarts only restore what you already armed. ./uninstall.sh --yes is a full wipe for that plugin (same teardown family wipe runs); without --yes you get TTY prompts for optional package drops.

Install

Workshop-style one paste (enable + integrate; installer asks [Y/n]):

omarchy plugin add https://github.com/AlxWolfenstein97/omatty.git --enable
~/.config/omarchy/plugins/io.github.alxwolfenstein97.omatty/install.sh

That clones into ~/.config/omarchy/plugins/io.github.alxwolfenstein97.omatty and arms hooks / Style after you confirm. Skip prompts: ~/.config/omarchy/plugins/io.github.alxwolfenstein97.omatty/install.sh --yes.

Or from an existing checkout:

~/.config/omarchy/plugins/io.github.alxwolfenstein97.omatty/install.sh
omarchy plugin enable io.github.alxwolfenstein97.omatty

How it works

  1. bin/omatty-switcher renders PNGs into ~/.cache/omarchy/omatty/previews/, busts the image-selector thumbnail cache, then opens omarchy-menu-images.
  2. On selection, Style launches Omarchy’s floating terminal running omatty-set (same privilege pattern as Unlock): patches /etc/vconsole.conf, restarts systemd-vconsole-setup. Install / uninstall / arm-all / wipe use the same TTY.
  3. Install also drops the Starship TTY profile + bashrc snippet.

CLI:

omatty list
omatty preview              # warm all mockups
omatty switcher             # picker → prints font id
omatty show ter-v32b        # print patched vconsole.conf
omatty set ter-v32b         # apply (sudo)
omatty set ter-v32b --dry-run
omatty reapply              # setfont again from current FONT= (sudo; active VT)
omatty reapply --all-vts    # optional chvt sweep — only with SDDM stopped
omatty clear                # pin default8x16 in conf+UKI, drop starship TTY wiring (sudo)
omatty current

Encrypted installs bake FONT= into the initramfs. omatty set and omatty clear run limine-mkinitcpio afterward — leave that sudo terminal open until it finishes. Wipe/clear leaves Arch default8x16 in conf + UKI so the next boot stays stock-sized.

Want even larger glyphs on a live console without changing FONT=? setfont -d doubles whatever face is loaded (horizontal + vertical).

Install does not force the DRM udev rule — optional for single-GPU / VFIO hops only. Interactive install.sh asks y/N in the same TTY as Pillow/Terminus (default No). Arm later anytime:

omatty install-drm
# or: ~/.config/omarchy/plugins/io.github.alxwolfenstein97.omatty/install.sh --with-drm-reapply

Fresh VM smoke test

omarchy plugin add https://github.com/AlxWolfenstein97/omatty.git --enable
# install.sh TTY: pillow + terminus (scanned); optional DRM y/N (default N)
# Style → TTY Fonts appears without a shell restart
# Pick ter-v32b → sudo terminal runs limine-mkinitcpio; Ctrl+Alt+F3 fat; reboot → LUKS/early TTY fat too
omatty current
omatty reapply   # sudo — same helper udev uses (active VT; SDDM-safe)

# Optional VFIO path:
#   omatty install-drm
#   ls /etc/udev/rules.d/99-omatty-reapply.rules /usr/local/lib/omatty/reapply

# plugin add alone + reboot → quiet restores wiring only; run install.sh / arm-all for deps/hooks
# ./uninstall.sh --yes → full teardown (DRM udev, FONT= → default8x16, pkgs if unused)
# Interactive ./uninstall.sh → TTY prompts for optional pkg drop
# Pillow drop with mangohud/goverlay installed → fails Required By; that is fine

Disable vs remove

Action What happens
omarchy plugin disable … Shell service stops. No theme-set hook — last FONT= / DRM reapply udev stay.
./uninstall.sh then disable / remove Menu, bashrc snippet, cache/state gone; OmaTTY-owned starship files removed (config dir kept if you left other files). Elevates omatty clear (pins FONT=default8x16 into conf + UKI; --yes aborts plugin remove if that fails). Live gettys may stay large until reboot. Optional ledger pkg drop.
omarchy pkg drop python-pillow Optional — only if this install recorded pulling it; may fail/stay if something else still requires it. TTY y/N on uninstall.
omarchy pkg drop terminus-font Optional — only if this install recorded pulling it; may fail/stay if something else still requires it.

Quiet Service install (--quiet): restores already-armed wiring only (DRM udev only if already passwordless). Deps + Style consent + DRM reapply come from interactive install.sh, --yes --with-drm-reapply, or family arm-all-family.sh. Menu + rescanPlugins so Style → TTY Fonts shows without a manual shell restart.

Full wipe — one shot (--yes skips pkg Y/n, ledger-only drops of packages this install recorded pulling (may fail and stay if something else still needs them — e.g. Goverlay after Pillow), and removes the plugin):

~/.config/omarchy/plugins/io.github.alxwolfenstein97.omatty/uninstall.sh --yes

Why not every console font?

archinstall’s Console font menu is exhaustive on purpose. For a Style carousel we only keep faces you can tell apart at a glance: the Arch default, two useful kbd fonts, and every Terminus Unicode size/weight the package ships — not a full archinstall clone, just the part that earns its keep. Mockups warm in parallel across CPU cores and skip tiles whose font / layout haven’t changed — same snappy reopen as the other Style extenders.

Check

bash ~/.config/omarchy/plugins/io.github.alxwolfenstein97.omatty/check.sh

Credits

License

MIT — see LICENSE.

About

Style menu TTY/console fonts with PSF mockups. Not broken — read README to arm Style menu after install.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages