project
Universal Launcher
A Windows desktop launcher that centralizes applications, project folders, shortcuts, notes, reminders, and frequently used tools.
Universal Launcher is a Windows desktop application inspired by launchers like Steam, but built for general-purpose local organization. Instead of focusing on one store or ecosystem, it lets the user collect executables, shortcuts, internet shortcuts, folders, and nested applications in one library.
The main idea is that a primary application can own related sub-applications. For example, Steam can be added as the main application and individual Steam shortcuts can be added under it. Visual Studio can also be added as the parent application for a project folder, so opening that folder launches Visual Studio directly in the project directory.
View the GitHub repository
Interface
The application starts with a username-based login. That username is used to load the user's applications, notes, and reminders on later launches.
The home page combines quick access to favorite applications with notes and reminders. A sidebar shows the five most recently launched programs, a pinned note, a copy of the reminders table, and a dark/light mode toggle.
The library is where applications are added and organized. A main app card can be created from an executable, shortcut, internet shortcut, or folder. Each card supports deleting, favoriting, assigning a category, and adding sub-applications through file or folder dialogs. Cards can be filtered by category and searched from the library view.
Data Model
User data is serialized into local files named around the active username: applications, notes, reminders, and the dark/light mode state are saved when the program closes and loaded again on startup.
The application data is organized through repository classes:
AppRepositorystores main applications, sub-applications, recently used applications, and favorite applications.NotesRepositorystores notes.RemindersRepositorystores reminders.
Applications share an abstract App base class with required members and
methods such as Launch() and ToString(). MainApp stores its list of
SubApp entries, while SubApp stores a SubAppType, including folder-based
entries that launch through the parent application with the folder path as an
argument.
Implementation
Application objects are created through an abstract factory pattern. An
IAppFactory interface is implemented by separate factories for the different
application types, while AppUtilities centralizes the helper methods needed by
the launcher.
The central utility method is GetAppInfo(string path). It identifies whether a
selected path is an .lnk, .exe, .url, or directory, extracts an associated
icon where possible, assigns a default icon for folders, and returns the
collected data as an AppInfo object.
The UI cards are generated from that information as WinForms user controls.
During deserialization, icons are regenerated through a RedrawIcons helper to
work around icon-color corruption after loading saved data.
The project also uses custom C# events for card deletion, main-application
launches, and category changes. Those handlers connect each card back to the
main form and were one of the more useful parts of the project for learning how
EventHandler and EventHandler<TEventArgs> work in practice.