Releases: Baebu/lineup_builder
Lineup Builder v1.3
Lineup Builder v1.3 — Release Notes
Visual Preview & UI Enhancements
- Visual Preview Tab — Added a real-time "VISUAL PREVIEW" tab alongside the text output. It generates an accurate DearPyGui mockup of the final Discord embed, rendering markdown formatting, relative timestamps (
<t:UNIX:R>), and image attachments exactly as they will appear in Discord. - Toast Notifications — Introduced a non-blocking toast notification system in the bottom-right corner. It provides unobtrusive, color-coded feedback for actions like saving, syncing, and bot connection statuses without interrupting your workflow.
- Collapsible Sections — The left panel now uses collapsible sections (Details, Genres, Links, Image, Discord) to save screen space. The app remembers your open/closed preferences across sessions.
- In-App Image Preview — The Image section now displays a properly scaled thumbnail preview of your selected embed image directly within the editor.
Editor & Roster Improvements
- DJ Autocomplete — Slot name inputs now feature a smart autocomplete dropdown that suggests DJs from your saved roster as you type.
- Inline DJ Editing — Added a dedicated edit button directly on lineup slots, allowing you to update a DJ's stream links or details on the fly without having to switch to the Roster tab.
- Smart Genre Packing — Genre tags now use an intelligent bin-packing algorithm to maximize horizontal space efficiency, keeping the UI clean and compact even with many tags.
Event Management Fixes & Improvements
- Fixed Race Condition in Event Duplication — Resolved a race condition where auto-save could bump the duplicated event's volume after it was saved, causing duplicate volume numbers. Volume calculation is now atomic with the save operation.
- Clean Slate on Event Deletion — When you delete a saved event, the editor now resets to a fresh "new event" state (blank title, single empty slot, current date at 20:00). This prevents accidentally saving remnants of the deleted event.
Discord Bot Upgrades
- Server (Guild) Selection — The bot integration now fetches all visible servers and allows you to select a specific server, which intelligently filters the channel list.
- Role Pinging — Added the ability to fetch server roles and select a specific "Role to Ping" (e.g.,
@EventNotify) when posting or scheduling a lineup.
Internal
- Added
toast.pyfor the global notification overlay system. - Added
preview.pyto handle the parsing and rendering of Discord embed visual mockups. - Added
sections.pymixin for collapsible layout state management. - Added
DiscordOAuthservice to handle the local callback server and secure token management. - Added
EventBusintegration for real-time reactivity across the new UI components.
Full Changelog: v1.2...v1.3
Lineup Builder 1.2
Lineup Builder v1.2 — Release Notes
Discord Bot Integration
- Discord Bot — Connect a Discord bot directly from the app. Configure your bot token, client ID, and invite link via a compact settings popup.
- Rich Embed Posting — Lineup posts are sent as styled Discord embeds with event title, start timestamp, genre tags, full lineup with times, and social links. Embed color matches your current theme accent.
- Embed Image — Attach a poster image to your Discord embed by pasting a URL or browsing for a local file. Inline controls (text input + Browse + Clear) keep the workflow compact.
- Channel Picker — Fetches your server's text channels via the bot API so you can post to Events, Popup, or Signups channels by name.
- Scheduled Posting — Schedule posts for future delivery. Pick a date/time, select a channel, and the app will automatically send the embed when the time arrives. Scheduled posts persist across restarts.
.envSupport — Bot token, client ID, and client secret can be loaded from a.envfile in the app directory for secure credential management.
Social Links & Output
- Social Links — Add social media / streaming links (Twitch, SoundCloud, etc.) that appear at the bottom of your lineup output and Discord embeds.
- GitHub Footer — Discord embeds now include a footer linking back to the project repo.
Themes & UI
- 8 Built-in Theme Presets — Slate (default), Midnight Blue, OLED Black, Crimson, Amber, Forest, Ocean, Violet.
- User Presets — Save and manage your own custom theme presets.
- Title Bar Theming — The window title bar color follows your active theme.
- Button Color Fix — Button colors now update correctly when switching themes.
Stability & Data
- Autosave & Crash Recovery — Automatic periodic saves with a restore-from-autosave modal on startup if unsaved work is detected.
- Improved YAML/JSON Persistence — Fixed social links parsing, autosave reliability, and modal restore flows.
- Slot Placeholder — Empty slots show a placeholder prompt instead of blank space.
Internal
- Renamed
DJRosterMixin→RosterMixinanddj_roster.py→roster.py. - Added
discord_service.pyanddiscord_oauth.pybackend modules (GUI-free). - Updated PyInstaller spec with new hidden imports.
Full Changelog: v1.1...v1.2
Lineup Builder 1.1
Lineup Builder v1.1 — "Dear PyGui Rework"
Released: March 6 2026
Overview
v1.1 is a full ground-up rework of the presentation layer. Every frontend widget, panel, popup, and callback has been migrated from CustomTkinter/Tkinter to DearPyGui (DPG). The backend remains pure Python with zero GUI imports; the mixin architecture is preserved and extended to 11 mixins.
GUI Framework Migration: CustomTkinter → DearPyGui
The most significant change in this release. Every piece of user interface was rebuilt from scratch using DearPyGui's retained-mode immediate-mode hybrid API.
- App loop:
app.mainloop()→app.run()with a per-frame DPG render loop - Primary window fills the viewport automatically via
dpg.set_primary_window()— no title bar chrome, no scroll, no resize handles - Two-column layout built with
dpg.table()anddpg.child_window(), replacing the oldCTkFramegrid. Left panel is fixed at 380 px; the right panel fills remaining space with a resizable column - All popup/modal windows are
modal=True,autosize=True,no_resize=True— they inherit the global theme automatically with no per-window styling needed - Default viewport: 1050×768, minimum 800×600
New & Improved UI Features
- Material Symbols Rounded icon font bundled as a full variable + static font family, used throughout the UI for crisp, scalable icons
- Global theme system —
apply_theme()builds a single DPG theme covering 30+ color slots and rounded-corner styles bound globally viadpg.bind_theme(). The old per-widget color-walk machinery (_recolor_widgets,_clean_list,COLOR_ATTRS) has been removed entirely - 3 built-in color presets: Slate (Default), Midnight, and OLED Black
- User-defined presets — save, apply, and delete custom color schemes from the Settings tab
- UI scale slider — a new
ui_scalesetting applies a global font/UI scale multiplier - Tabbed left panel — Event, DJ Roster, and Settings tabs replace the old layout. Settings are now a first-class panel, not a separate window
- Redesigned date/time picker — removed dependency on
tkcalendar. Date and time are now two inline inputs with a calendar-icon trigger that opens a DPG modal for visual date selection - Widget factory module (
widgets.py) —add_icon_button(),add_primary_button(),add_danger_button(),add_styled_input(),add_styled_combo()all bind the correct theme automatically, keeping all call sites clean - Genre tag pills rendered as DPG toggle buttons with per-item theme binding for active/inactive visual state
- DJ roster drag-and-drop ported to DPG's native drag/drop API with flash-highlight feedback on drop
Architecture & Code Changes
DPGVar/DPGBoolVar(inslot_ui.py/frontend/types.py) replacetkinter.StringVar/BooleanVar, exposing the same.get()/.set()API so the rest of the codebase required minimal changesSlotStatereduced to a pure data holder; the UI row is built separately bybuild_slot_row()- types.py —
SlotData,DJInfo, andEventSnapshotextracted into a dedicated pure-Python module with zero GUI imports - Debounce rewritten —
threading.Timerreplaces alltkinter.after()/after_cancel()calls. Aqueue.SimpleQueueis drained each DPG frame byprocess_queue()to push timer callbacks back onto the main thread safely - Window geometry persistence updated to read/write via
dpg.get_viewport_width()/dpg.get_viewport_height()instead ofwinfo_width()/winfo_height() - Intermediate refactor work prior to DPG migration included extracting
theme.pyas a standalone module, overhauling the UI builder, and fixing DJ roster drawer scroll and open/close animation bugs
Dependency Changes
| Removed | Added |
|---|---|
customtkinter |
dearpygui |
tkcalendar |
Pillow |
iconipy |
Build & Packaging
- PyInstaller spec updated:
datasnow includes Material_Symbols_Rounded and icon files;hiddenimportsupdated fordearpygui - Application icon (
icon.ico/icon.png) bundled for the DPG viewport
Removed
tests/test_architecture.py,tests/test_import.py— legacy tests that depended on CustomTkinter internals; removed pending a DPG-aware test suiteARCHITECTURE.md— superseded by the inline copilot-instructions.md and updated README
Full Changelog: 1.0...1.1
Lineup Builder 1.0
Lineup Builder is a desktop app for building DJ event lineups and generating formatted output for Discord or plain text.
Features
Event Builder
- Set event title, volume number, and start date/time
- Add genre tags (saved for reuse across events)
- Build a lineup of performer slots with DJ name, genre, and set duration
- Drag and drop slots to reorder the lineup
- Optional Open Decks section with configurable slot count and duration
DJ Roster
- Persistent DJ roster with name and stream link (VRCDN supported)
- Drag a DJ from the roster directly into the lineup
- Search and filter the roster
- Inline save/delete per DJ card
Output Formats
- Discord — Unix timestamps (
<t:...:t>), markdown headers, auto-suppressed embed links - Plain Text —
HH:MMtimes with local timezone, no markdown - Quest — VRCDN HTTPS stream URLs for Meta Quest
- PC — VRCDN
rtspt://stream URLs for PCVR
Persistence
- Saves lineups, DJ roster, genres, and event titles to local YAML files
- Restore and reload past events; duplicate and increment volume number
- Window size and position saved between sessions
Download
LineupBuilder.exe — standalone Windows executable, no installation required.