Deck Card Widget is a low-resource desktop overlay controller for streamers, educators, presenters, analysts, and creators who want reusable on-screen βdeck cardsβ without needing a browser source, Electron app, or game engine.
It uses a private controller window and a separate OBS-friendly output window. The controller edits cards, emoji stickers, PNG layers, custom text layers, and built-in display labels. The output window is the clean visual surface meant to be captured by OBS.
Built for simple desktop control, fast iteration, and personalized visual cards.
- π₯οΈ Separate controller + output windows
- π₯ OBS Window Capture friendly output
- π Deck card buttons with overflow card storage
- βοΈ Display Edit tab for changing built-in output labels
- π Personal emoji preset file using a simple
.emojiformat - πΌοΈ PNG image layers for logos, icons, and custom graphics
- π€ Custom text layers for card-specific messages
- πΎ
.buttstorepersistence for app state, cards, display settings, and layout - π¦
.deckbuttcard export/import for reusable individual cards - β‘ Low-resource design using Python + Tkinter
- π« No Electron, no browser overlay requirement, no pygame
Deck Card Widget lets a creator prepare multiple βcardsβ and switch between them during a stream, recording, lesson, presentation, or live discussion.
Each card can contain:
- source or link information
- confidence/status fields
- claim/evidence/question text
- emoji stickers
- imported PNG images
- custom text layers
- editable built-in display labels
The output window can stay clean and stable while the controller window remains private.
The output window has a stable title for OBS:
Deck Card Widget - Output
Recommended OBS setup:
- Launch Deck Card Widget.
- Confirm the output window is visible.
- In OBS, add Window Capture.
- Select:
Deck Card Widget - Output
- Resize/crop in OBS as needed.
The default output canvas is designed around:
960 x 500
Typical standalone folder:
Deck_Card_Widget/
3dcp_perspective_console.py
requirements.txt
launch_deck_card_widget_venv.sh
launch_3dcp_console_venv.sh
setup_venv_3dcp_console.sh
doctor_deck_card_widget.sh
acceptance_deck_card_widget.sh
data/
emoji_presets/
default_presets.emoji
templates/
default_episode_template.buttstore
docs/
user_data/ # created at runtime
The app stores user/runtime files outside the main code path when possible:
user_data/
buttstores/
deckbutts/
exports/
imported_pngs/
runtime/
current.emoji
.venv/
Do not delete user_data/ unless the goal is to reset local cards, presets, runtime state, and exports.
Minimum practical requirements:
- Python 3.10 or newer
- Tkinter / Tcl-Tk support
- pip
- a desktop session capable of showing GUI windows
- Pillow
- qrcode
Python package requirements are listed in:
requirements.txt
Current pip requirements:
qrcode[pil]>=7.4.2
Pillow>=10.0.0
This project was designed and tested around a Kubuntu 24 desktop workflow using X11/Wayland-aware window recovery.
Install system pieces:
sudo apt update
sudo apt install python3 python3-venv python3-tk python3-fullFrom the project folder:
chmod +x *.sh
./setup_venv_3dcp_console.sh
./launch_deck_card_widget_venv.shOptional checks:
./doctor_deck_card_widget.sh
./acceptance_deck_card_widget.shCompatibility launcher:
./launch_3dcp_console_venv.shInstall Python and Tk support:
sudo pacman -Syu python tkThen run the included setup script:
chmod +x *.sh
./setup_venv_3dcp_console.sh
./launch_deck_card_widget_venv.shManual fallback:
python -m venv user_data/.venv
source user_data/.venv/bin/activate
python -m pip install --upgrade pip
python -m pip install -r requirements.txt
python 3dcp_perspective_console.pyTkinter test:
python -m tkinterA small Tk test window should appear.
Recommended: install Python from the official Python.org macOS installer, because it normally includes working Tkinter support.
Verify Tkinter:
python3 -m tkinterCreate a local virtual environment:
python3 -m venv user_data/.venv
source user_data/.venv/bin/activate
python -m pip install --upgrade pip
python -m pip install -r requirements.txt
python 3dcp_perspective_console.pyThe included .sh launchers may also work from Terminal after permissions are set:
chmod +x *.sh
./setup_venv_3dcp_console.sh
./launch_deck_card_widget_venv.shIf Tkinter fails on a Homebrew-based Python install, use the Python.org installer or install the matching Tk/Tcl support for that Python version.
The included shell scripts are designed for Linux/macOS-style terminals. On Windows, use PowerShell or Windows Terminal with Python installed.
Verify Tkinter:
py -m tkinterCreate and activate a local virtual environment:
py -m venv user_data\.venv
.\user_data\.venv\Scripts\Activate.ps1
python -m pip install --upgrade pip
python -m pip install -r requirements.txt
python .\3dcp_perspective_console.pyIf PowerShell blocks activation for the current terminal session:
Set-ExecutionPolicy -Scope Process -ExecutionPolicy Bypass
.\user_data\.venv\Scripts\Activate.ps1Windows users can also run the app through Git Bash or WSL, but native PowerShell is usually simpler for a normal desktop launch.
- Launch the app.
- Use the private controller window to edit the active card.
- Use the sidebar deck buttons to switch between the first six cards.
- Use Deck Card Storage for extra cards.
- Capture the output window in OBS.
- Save/export cards as needed.
Common card tools:
- Add Source: create a normal editable card
- Add Blank: create a blank/hide card
- Duplicate Card: copy the active card
- Delete Card: remove the active card
- Save Card: export one reusable
.deckbutt - Load Card: import a
.deckbutt - Export Card PNG: save the current visual card as PNG
- Export All PNGs: export every card
The Display Edit tab controls built-in output labels that were previously hard-coded into the display renderer.
Use it to change public-facing text such as:
- top title
- status label
- card type label
- confidence label
- QR label
- brand/subtitle labels
- claim/evidence/question section labels
- scan animation label
Display Edit supports:
- text editing
- text color
- optional border
- border color
- font selection
- default text reset
- default color reset
- default font reset
- show/hide
- X/Y movement
- nudge buttons
- snap/move buttons
- Apply Now for immediate refresh
Display settings are stored in the active .buttstore under:
header.display_textOlder .buttstore files are upgraded when loaded by adding the missing header.display_text section without deleting existing cards or layers.
Deck Card Widget supports a simple .emoji text format so users can personalize the emoji picker.
Default packaged file:
data/emoji_presets/default_presets.emoji
Optional user override file:
user_data/current.emoji
When user_data/current.emoji exists, the app loads it first. If it does not exist, the packaged default preset file is used.
From the project folder:
mkdir -p user_data
cp data/emoji_presets/default_presets.emoji user_data/current.emojiOn Windows PowerShell:
New-Item -ItemType Directory -Force user_data
Copy-Item data\emoji_presets\default_presets.emoji user_data\current.emojiThen edit:
user_data/current.emoji
Each emoji record uses:
emoji|name|category /,
Examples:
β
|Confirmed|Status /,
β|Rejected|Status /,
π§ͺ|Experiment|Lab /,
π¬|Scene|Streaming /,
π|Pinned Point|Notes /,
Minimal emoji-only records also work:
π₯ /,
π /,
π‘ /,
Names and categories are filled with defaults when omitted.
- Save the file as UTF-8.
- Keep the record separator
/,after each entry. - Use short names for cleaner picker display.
- Group related emoji with the same category name.
- Restart the app after changing
current.emojiso presets reload cleanly.
A .buttstore stores the full app session state:
- deck cards
- active card
- output/controller geometry
- display text settings
- layer data
- runtime metadata
A .deckbutt stores one reusable deck card.
Useful for:
- reusable stream cards
- card templates
- sharing card layouts
- keeping a personal card library
A .emoji file stores emoji presets for the emoji sticker picker.
Hotkeys work when the controller has focus and are ignored while typing in text fields.
Ctrl+1 ... Ctrl+6 Select deck cards
Ctrl+B Blank / Hide
Ctrl+O Show output
Ctrl+Shift+O Hide output
Ctrl+R Scan Once
Ctrl+L Toggle Scan Loop
Ctrl+S Save + Apply
Ctrl+E Export Card PNG
Ctrl+Alt+R Rescue Output Window
Ctrl+Alt+O Toggle OBS mode
Linux/macOS:
./acceptance_deck_card_widget.shManual Python compile check:
python3 -m py_compile 3dcp_perspective_console.pyWindows PowerShell:
python -m py_compile .\3dcp_perspective_console.pyTkinter check:
python -m tkinterA small test window should appear if Tkinter is working.
Recommended update flow:
- Close Deck Card Widget.
- Back up
user_data/. - Replace the app folder with the new version.
- Restore or keep
user_data/beside the app folder. - Run setup again:
./setup_venv_3dcp_console.sh- Launch:
./launch_deck_card_widget_venv.shFor Windows manual installs, re-run:
.\user_data\.venv\Scripts\Activate.ps1
python -m pip install -r requirements.txt
python .\3dcp_perspective_console.pyExisting .buttstore files should remain usable. New storage sections are added on load when needed.
Use the Output Tools tab:
- Press Rescue Output Window.
- Press Reset Output Window if needed.
- Re-select the output window in OBS if OBS keeps an old target.
Hotkey:
Ctrl+Alt+R
Confirm the output window title:
Deck Card Widget - Output
Then refresh or recreate the OBS Window Capture source.
Run:
python -m tkinterIf no test window opens, install or repair Tkinter/Tcl-Tk for the active Python installation.
Linux users usually need a system package such as python3-tk or tk.
Run the setup script again:
./setup_venv_3dcp_console.shManual fallback:
python -m pip install -r requirements.txtSome Linux desktop environments handle borderless or always-on-top windows differently. The app starts in normal framed mode for safer recovery. Enable OBS/borderless mode only after confirming the output window is visible.
Deck Card Widget is a standalone public project evolved from the original 3DCP Perspective Console concept and implementation approach.
Original project:
https://github.com/DigiMancer3D/3DChangesPerspectives/tree/main/PerspectiveConsole
This standalone version focuses on reusable deck-card overlays, public-facing display labels, emoji customization, OBS capture, and storage-backed editing.
- livestream discussion cards
- VTuber or PNGTuber overlay panels
- lesson/presentation cards
- claim/evidence/source review overlays
- podcast visual prompts
- stream segment cards
- reusable branded information cards
- OBS-friendly local overlays
Deck Card Widget is meant to be easy to run, easy to customize, and easy to capture. It keeps the moving parts simple: one Python app, local files, a desktop GUI, and an OBS-visible output window.