Booting portfolio system
20%
← Return to work

project

Universal Launcher

A Windows desktop launcher that centralizes applications, project folders, shortcuts, notes, reminders, and frequently used tools.

01
software
02
Team Lead/Lead Dev
03
C# / .NET Framework 4.8 / Windows Forms

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:

  • AppRepository stores main applications, sub-applications, recently used applications, and favorite applications.
  • NotesRepository stores notes.
  • RemindersRepository stores 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.