Getting started

Write a homebrew application in C#, build it into an installable package, and run it on the console. This page gets you from nothing to a running module; Setup has the full per-operating-system install, and Samples covers the other kinds of project you can start from.

What you need

  • The .NET 10 SDK (dotnet --version reports 10.x).
  • On Windows, WSL — the build runs the compile step there automatically. The runtime itself comes from the .NET SDK, so there is nothing else to set up. See Setup.
  • This SDK checked out, with SHARPPROSPERO_ROOT pointing at the SharpProspero folder.

Check the machine is ready:

pwsh doctor.ps1

It reports the .NET SDK, the SDK root, and (on Windows) the WSL compile host, and prints what to set for anything missing. A plain build and the tests need only .NET; building a module runs the compile step on Linux (via WSL on Windows).

1. Create a project

Copy the closest sample folder into your workspace and rename it. On Windows (PowerShell):

Copy-Item -Recurse $env:SHARPPROSPERO_ROOT/samples/prospero-app MyGame

On Linux (bash):

cp -r $SHARPPROSPERO_ROOT/samples/prospero-app MyGame

The copy carries Program.cs, the sce_sys package metadata (param.json, icon0.png), and a SampleApp.csproj. Edit sce_sys/param.json to set the title id and display name; see The sce_sys/param.json fields for every field. Other project kinds — an interface app, a library, a toolbox — are in Samples.

2. Write the application

The sample’s Program.cs derives from ProsperoApp and draws each frame:

using SharpProspero.Application;
using SharpProspero.Graphics;
using SharpProspero.Interop.Pad;

internal sealed class Game : ProsperoApp
{
    protected override void OnFrame(FrameContext context)
    {
        Surface surface = context.Surface;
        surface.Clear(Color.FromRgb(0x10, 0x14, 0x1A));
        surface.DrawTextCentered("My Game", 480, 6, Color.White);

        if (context.Input.IsPressed(ScePadButton.Options))
            context.RequestExit();
    }
}

internal static class Program
{
    private static void Main()
    {
        using var app = new Game();
        app.Run();
    }
}

ProsperoApp opens the display and controller, runs a paced loop that calls OnFrame, and tears everything down on exit. From here, Graphics covers drawing and the Interface toolkit builds screens out of widgets instead of drawing by hand.

3. Build the package

One command compiles, links and packs:

pwsh MyGame/build.ps1

It produces an installable *.pkg under MyGame/out. To get the loose files instead of a package (handy while iterating), pass -Output Folder; eboot.bin, sce_sys and any sce_module libraries land together in MyGame/out/module. Copy or archive that whole folder, not eboot.bin alone.

4. Run it on the console

Install the *.pkg on a console in the appropriate mode for unsigned packages, then launch it from the home screen. The folder output is useful for inspecting the module or copying files directly.

Where to go next

  • Setup — the full install for Windows and Linux (x64).
  • Samples — starting points for each kind of project.
  • Extras — tips per form and package metadata.
  • Help — troubleshooting for the build, pack, install, and run.
  • Architecture — how the layers fit together.
  • Build pipeline — what compile, link and pack each do.

Copyright © SvenGDK 2026. Distributed under the GPL-3.0-or-later license.

This site uses Just the Docs, a documentation theme for Jekyll.