The ProtoStream App (WIP)
An All-In-One Android App for Controlling Protogen Fursuit Heads

Got a question about the ProtoStream app or a feature request? Shoot me a message and I'll get back to you ASAP!

Discord
Telegram
Bluesky
Frequently Asked Questions
Q:  Will ProtoStream be available on iOS?

A: There are currently no plans to port ProtoStream to iOS devices, and an iOS port is highly unlikely to be considered unless there is both significant demand and enough community financial support. Maintaining an iOS version would require a 99 USD annual Apple Developer Program membership, which is too high a cost for me to feasibly cover for the sake of providing the app on iOS.

Q:   Is this vibecoded?

A: While AI tools assisted with app localization and the learning curve of Android development, all of ProtoStream's code, feature design, and supporting documentation (like this website) were hand-written by a single—and unfortunately, human—developer. Additionally, all UI elements were drawn by real human artists. Yes, humans are capable of using em dashes. Shocking, I know.

Q:   Why not make ProtoStream open source?

A: True "open source" licenses explicitly permit commercial use, which would legally allow third parties to take the code, repackage it, and lock it behind a paywall. By making ProtoStream source-available, it ensures the app remains fully accessible to the community. While you are welcome to accept voluntary donations (such as through Patreon or Ko-Fi) to support your work on custom modifications, you cannot lock your customized version behind a paywall—a freely accessible version must always be available.

Looking to download the ProtoStream app? Click here!
1. My Way... (or the highway?)

To replicate my setup, you will need an ESP32 microcontroller board that features built-in Wi-Fi and HUB75 support. If you don't know what any of that means, don't worry—I will go deep into detail on how to get everything working. It's actually quite simple, and most of the work has already been done for you!

I went with the Adafruit MatrixPortal S3, and I highly recommend you do the same, as this board comes with almost everything you will need for hardware straight out of the box—including a built-in 3-axis accelerometer (LIS3DH) that powers ProtoStream's Head & Motion Gestures and the built-in ProtoPhysics sandbox! More specifically, you may want to consider purchasing the version with the uFL connector, as this will allow you to customize the antenna connection for better range and performance. You can purchase this version from Adafruit's website.

If you want your visor to react when someone "boops" your snoot, you can also pick up an optional Adafruit VEML7700 Ambient Light Sensor and a short STEMMA QT cable. This plugs directly into the STEMMA QT port on the MatrixPortal S3 with zero soldering required! (And if you don't want to buy a light sensor, don't worry—you can still trigger boop reactions using a wireless controller button or skip boop detection entirely.)

This method is surprisingly easy, requires absolutely zero soldering (unless you want to wire up a custom interior HUD display that doesn't use a plug-and-play STEMMA QT cable), and demands little to no prior experience working with electronics.

Note: This method will ONLY work with the specific LED matrices offered by JtingF, or any other pair of standard 64x32 pixel matrices that are chained together via a HUB75 cable. If you source your LED matrices elsewhere, triple-check their dimensions! The matrices supplied by JtingF are 196x64mm. If you are using JtingF's 3D print files, your panels MUST be this exact size to fit properly inside the visor housing.

2. The Firmware

Note: If you want to use an emulator to test the app without needing an ESP32, please ignore this section, and skip straight to The ProtoStream App or Testing the App Without an ESP32! Alpha testers, that means you!

Because the MatrixPortal S3 uses an ESP32-S3 chip, it is incredibly powerful, but it doesn't speak "Arduino" right out of the box. We need to install some board manager files and libraries to get everything communicating smoothly. Grab a USB-C cable capable of data transfer (not just a charging cable) and connect your MatrixPortal S3 to your PC.

You will need to download the Arduino IDE (Integrated Development Environment), which you can get here. I recommend downloading the latest version.

Once Arduino IDE is installed and open, follow these steps exactly:

Step 1: Add ESP32 Board Support
  1. Click File in the top-left corner, then select Preferences.
  2. Look for the field labeled "Additional boards manager URLs" near the bottom of the window.
  3. Copy and paste this exact link into that box:
    https://espressif.github.io/arduino-esp32/package_esp32_index.json
  4. Click OK to close the Preferences window.
  5. Now, on the left side of the screen, click the Boards Manager icon (it looks like a file folder with a little board inside, or go to Tools > Board > Boards Manager...).
  6. In the search bar at the top of the Boards Manager, type: esp32
  7. Look for the result simply titled "esp32 by Espressif Systems" and click Install. This download might take a few minutes!
Step 2: Install Required Libraries

Next, we need to install the specific code libraries that tell the board how to talk to the HUB75 LED matrices, the (optional) inner OLED screen, the built-in accelerometer, and the (optional) boop light sensor.

  1. Click the Library Manager icon on the left side of the screen (it looks like a stack of books, or go to Sketch > Include Library > Manage Libraries...).
  2. In the search bar, search for and install each of these five libraries:
    • Adafruit GFX Library (by Adafruit)
    • Adafruit SSD1306 (by Adafruit)
    • ESP32 HUB75 LED MATRIX PANEL DMA Display (by mrcodetastic)
    • Adafruit VEML7700 Library (by Adafruit)
    • Adafruit LIS3DH (by Adafruit)
  3. Note: If Arduino pops up a window asking if you want to install "missing dependencies" (such as Adafruit BusIO or Adafruit Unified Sensor) while installing these, always click "Install All"! Even if you do not have an OLED screen or a VEML7700 boop light sensor plugged into your board, you still need these libraries installed so the firmware code can compile. On startup, the firmware automatically checks which sensors are connected and will happily run without any that aren't plugged in!
Step 3: Select Your Board and Port
  1. Go up to the top menu and click Tools > Board > esp32.
  2. Scroll down that long list until you find "Adafruit MatrixPortal ESP32-S3" and click it.
  3. Go back to Tools > Port. You should see a COM port listed there (it might even say "Adafruit MatrixPortal S3" next to it). Click it to select it. (If you don't see a port, your USB cable might be power-only, or the board isn't plugged in fully!)
Step 4: Upload the Code
  1. Go to File > New Sketch to open a blank editor.
  2. Delete any default code that is already sitting in the window so it is completely empty.
  3. Copy and paste the custom firmware code I have written (ProtoStreamESP32FirmwareVBP.txt) directly into the main editor window.

    Note: By default, the firmware is set to display the LED matrices at maximum brightness (255). If you want to reduce the brightness, you can change the display->setBrightness8(255); value on line 168 to a lower number between 0 and 255. I recommend keeping it at the default value even if it appears extremely bright on your desk, as the semi-opaque outermost visor will dim it significantly.

  4. Finally, click the right-facing arrow (Upload) in the very top-left corner of the IDE.

    Note: If you are receiving an upload error (such as PermissionError(13, 'A device attached to the system is not functioning.', None, 31)), you may need to enter ROM bootloader mode. This can be achieved by pressing and holding the oval-shaped BOOT button near the middle-left of the board, then—while keeping BOOT held—pressing and releasing the button labeled RESET near the top-left of the board one time, and finally releasing the BOOT button. You will know you have entered ROM bootloader mode when the status NeoPixel LED displays a solid color (rather than flashing as it was before). After entering ROM bootloader mode, click Tools > Port, select the new port that has appeared in the list (it usually says something like FamilyController), and click Upload again.

The Arduino IDE will now compile the code (which might take a minute or two) and write it to your board. Look at the black output box at the bottom of the screen. If it says "Done uploading," you are good to go!

3. Pairing Your Phone to the Visor & First-Time Setup

To make this all work, I developed a custom Android app! This app should function on any device running Android 7.0 or newer, though it has currently been most thoroughly tested on Android 12.0, Android 13.0, Android 16.0, and Android 17.0.

You can download the most recent version of the app directly from this page. Simply download the .apk file to your phone, run it, and follow the prompts to install. Or, if you wish to support the app's development and any other future endeavors—as well as get the added benefit of automatic updates—the ProtoStream app will also be available on the Google Play Store (Soon!).

Note: ProtoStream is and always will be completely free of charge. The app is source-available, and you are welcome to view and modify the source code, as well as share your modified versions. While you are permitted to accept voluntary donations (such as through Patreon or Ko-Fi) to support your individual development efforts, commercial paywalls are strictly prohibited. You cannot lock your customized version behind a paywall; a free version must always remain available. Unauthorized redistribution of the official core application or standalone binaries is also prohibited.

Permissions & The Interactive Onboarding Tour

When you launch ProtoStream for the very first time, the app will make sure you have all the permissions needed for its features to work properly:

  • Microphone (used by Audio Visualizer and Vocal Sync)
  • Location & Nearby Devices (required by Android to scan for and bind directly to your ESP32's local Wi-Fi hotspot)
  • Photos and Videos (used to import your custom faces, emotes, and GIFs)

Simply tap each permission button in the pop-up panel; as you grant each one, its button will turn green, and the panel will automatically close once all permissions are granted.

Right after that, I (well, a digital version of me—Yen!) will pop up on screen to offer you an interactive, step-by-step tour of the entire ProtoStream app! The tour walks you through choosing your language, connecting to your visor, using the radial menus, and testing out every major feature hands-on.

Special thanks to gigasrock for creating the assets used to guide you around.

  • Want to skip the tour? If you're already a pro (or just want me to stop yapping), simply tap directly on Yen's face when prompted and confirm that you'd like to exit!
  • Need a refresher later? You can replay the entire tour—or jump straight into a mini-tutorial for one specific feature—at any time by opening Settings and tapping the "Help & Tour Guide" button at the top of the page.
Connecting to Your Visor's Wi-Fi

Once your ESP32 is flashed with the firmware and your phone has ProtoStream installed, you are ready to pair the two!

  1. Power on your ESP32 board by plugging a USB-C cable into it connected to your computer or to a 5V portable power bank (like a standard phone charger). It will automatically display its startup face and create a Wi-Fi hotspot named "MatrixStreamer" (with the default password "ProtoStream").
  2. Open the ProtoStream app and look at the top navigation bar. Here you will see three buttons:
    • Connect to Wi-Fi (the large blue button on the left)
    • D/C (the red-outlined disconnect button in the middle)
    • Settings (the gear icon button on the right)
  3. Tap the "Connect to Wi-Fi" button. A banner at the top will say "Searching for MatrixStreamer", and after a few seconds, your phone will automatically connect and bind to the ESP32's hotspot!
  4. You will know you are connected when a toast message appears saying "Connected & Bound to MatrixStreamer", and the Connection Status Indicator right underneath the top buttons changes from a red dot ("Disconnected from Protogen") to a glowing green dot ("Connected to Protogen").
  5. When you are done using your visor and want to sever the connection, simply tap the "D/C" button at the top of the screen.

A Quick Connection Tip: You may occasionally have to tap "Connect to Wi-Fi" twice if your phone was already actively connected to your home Wi-Fi network prior to tapping the button. Using the in-app "Connect to Wi-Fi" button is strongly recommended because it binds the app's data socket directly to the visor while still allowing your phone to use mobile data! If your phone model refuses to connect through the in-app prompt, you can manually connect to the "MatrixStreamer" network in your phone's system Wi-Fi settings instead (though doing so manually may temporarily pause your internet access while connected to the visor).

Note on Customizing Your Wi-Fi Name & Password: If you plan on wearing your suit at a convention where dozens of other Protogens might also be using ProtoStream, you will definitely want to customize your Wi-Fi network name and password so nobody else accidentally connects to your face!

  • To do this, open the firmware code in the Arduino IDE and edit the ap_ssid ("MatrixStreamer") and ap_pass ("ProtoStream") variables on lines 44 and 45 before uploading it to your ESP32 (your password must be at least 8 characters long).
  • Then, open the ProtoStream app on your phone, tap the Settings gear icon in the top-right corner, scroll to the "ESP32 Wi-Fi Setup" card, type your new SSID and Password into the boxes, and tap "Save".
  • Already flashed your firmware, but want to change the network name and password later? No worries—just edit the code and flash it again! Any subsequent flash cleanly overwrites the previous one.
4. The ProtoStream App

The main screen of ProtoStream is designed to be clean, fast, and easy to use—even with limited visibility inside a suit head! Below the top connection bar and status indicator, the interface is centered around three Radial Menus and a collapsible Static Image Slots drawer at the bottom.

How the Radial Menus Work

Instead of cluttering your screen with dozens of tiny buttons, ProtoStream organizes its tools into three circular radial menu buttons stacked vertically in the middle of the main screen:

  1. Main Radial (Top circular button with the ProtoStream app icon)
  2. Misc. Radial (Middle circular button)
  3. Display Mode (Bottom circular button displaying your active Display Mode icon)

To use any radial menu:

  1. Tap and HOLD your finger on the circular button. A wheel of icons will smoothly pop out around your finger.
  2. Without lifting your finger, SWIPE in the direction of the feature you want to use.
  3. RELEASE your finger to launch that feature! (If you change your mind, just slide your finger back to the center or away from the icons before letting go.)

Here is where everything lives by default:

  • Main Radial Menu (Your core streaming and voice/audio tools):
    • Swipe UP (12 o'clock) — Start Live Screen Streaming: Mirrors your phone's entire screen (or a chosen app) live onto your visor in real time.
    • Swipe DOWN (6 o'clock) — Stop Streaming / Clear: Immediately stops your active screen stream or static image stream.
    • Swipe LEFT (9 o'clock) — Audio Visualizer: Opens the Visualizer Settings pop-up to turn your visor into a sound-reactive equalizer or beat-synced GIF display.
    • Swipe RIGHT (3 o'clock) — Vocal Sync: Opens the voice-activated expression switcher.
  • Misc. Radial Menu (Your creative tools, emote switcher, and games):
    • Swipe UP (12 o'clock) — Emote Panel: Opens the instant emote switcher with controller keybind support.
    • Swipe DOWN-LEFT (8 o'clock) — Drawing: Launches the built-in pixel art studio.
    • Swipe DOWN-RIGHT (4 o'clock) — Games Plugin Manager: Opens the visor game arcade and custom game loader.
  • Display Mode Radial Menu (Quick display layout switcher):
    • Swipe UP (12 o'clock) — Centered Across Both (128x32)
    • Swipe DOWN-RIGHT (4 o'clock) — Duplicate (64x32 x2)
    • Swipe DOWN-LEFT (8 o'clock) — Mirror Right Side

Note: Want to rearrange which features are on which wheel, change their clock positions, or hide buttons you don't use? You can customize every single radial slot inside the Settings menu!

Display Modes

ProtoStream offers three distinct Display Modes that control how graphics are mapped onto your visor's two 64x32 LED matrices. You can switch between these at any time using the Display Mode Radial Menu on the main screen—even while you are actively streaming, and the visor will update on the fly!

  • Duplicate (64x32 x2): This is the default setting. It takes a 64x32 image (or your scaled phone screen) and displays identical copies on both the left and right matrices.
  • Centered Across Both (128x32): This mode spans your image continuously across both matrices, treating your visor as one wide, unified 128x32 pixel display split down the middle. This is ideal if you have artwork drawn on a 128x32 canvas or want asymmetrical expressions (like a wink or a raised eyebrow on only one side).
  • Mirror Right Side: This name can sound slightly counter-intuitive at first, so here is how it works: it acts like Duplicate mode, except the image on the "right" matrix is flipped horizontally so both sides of your face stay symmetrical!
    (Important Geometry Note: "Right Side" refers to the panel on your right when the helmet is sitting on a table facing you. When you are actually wearing the helmet, the panel being flipped is on your anatomical left! If your eyes/mouth appear backward on your suit, your physical HUB75 panels were mounted or chained in the reverse order.)
Static Image Slots & One-Time ("Non-Slot") Uploads

At the bottom of the main screen, you'll find a collapsible card labeled "Static Image Slots". Tap anywhere on its top header bar to expand (▼) or collapse (▶) the drawer.

Unlike live screen streaming—which mirrors whatever is actively happening on your phone screen—Static Image mode streams a dedicated image or animated GIF directly from a background service. That means once you push an image or GIF from this menu, it will stay on your visor even if you exit the app, switch to other apps, or lock and turn off your phone's screen!

Note: GIFs will pause if you disconnect from the board's Wi-Fi.

When you expand the Static Image Slots drawer, you'll see two buttons across the top:

  1. Non-Slot (Quick One-Time Upload):
    • Tapping "Non-Slot" opens your phone's gallery so you can pick any static image or animated GIF and immediately push it to your visor without saving it into a permanent slot.
    • Android will ask for permission to start screen capture/projection (this is required by Android to run the high-priority background streaming service)—be sure to accept it!
    • The uploaded image or GIF will automatically use whatever Display Mode and Interpolation mode you currently have selected.
  2. + Add Slot (Persistent Custom Slots):
    • Tapping "+ Add Slot" creates a new permanent slot card in the list below. You can create as many slots as you'd like, and they will all be saved automatically when you close the app.
    • Here is how to use each slot card:
      • Uploading or Changing the Graphic: Tap directly on the square thumbnail box on the left side of the slot card to pick a static image or animated GIF from your device. (Note: The thumbnail is just a quick reference preview and does not reflect how the image will be scaled on the visor.)
      • Renaming a Slot: Quickly triple-tap (tap three times fast) directly on the slot's name text in the middle of the card! This unlocks the text box and pops up your keyboard so you can type a custom name.
      • Pushing to the Visor: Tap the blue circular ">" button on the right side of the card. Accept the Android screen-sharing prompt, and that slot's image or GIF will immediately start streaming to your visor!
      • Deleting a Slot: To prevent accidental deletions while suiting, the red delete button requires you to tap and HOLD it for 3 full seconds. A visual progress animation will fill up while you hold your finger down; once it finishes, the slot is removed.
      • Stopping a Static Stream: To pause a displayed GIF, simply use the Main Radial Menu and swipe down to "Stop Streaming / Clear".
Audio Visualizer

Want to turn your visor into a reactive audio equalizer or display custom animated GIFs that groove to the beat of the music? That's where the Audio Visualizer comes in!

To open it, tap and hold the Main Radial button and swipe LEFT (9 o'clock). (If you were already streaming your screen, the app will automatically stop the screen stream for you before opening the visualizer!) The first time you open it, Android will prompt you for microphone access—select "While using the app" so the visualizer can hear surrounding music and voices.

This opens the "Visualizer Settings" pop-up menu, which gives you three main visual styles across the top:

  • Solid: Displays classic frequency equalizer bars across your visor using a single solid color chosen from a preset list (Red, Green, Blue, Cyan, Magenta, Yellow, White, Orange, Purple, or Pink).
  • Gradient: Lets you pick three distinct colors (Left, Middle, and Right) that blend together into a smooth horizontal color gradient across the equalizer bars.
  • GIF: Lets you select a custom animated GIF that animates dynamically in response to sound! Tap "Select GIF" to pick your file. Beneath that, you'll find a toggle switch labeled "Rewind on Silence (off = Reset)":
    • With the toggle OFF (Default): The GIF plays forward while sound is detected, and immediately snaps back to Frame 1 the moment it gets quiet.
    • With the toggle ON: The GIF plays forward while sound is detected, and smoothly plays backward in reverse when silence is detected until it settles back at the first frame.

At the bottom of the pop-up, you'll find a slider for Microphone Sensitivity. Slide this higher in quiet rooms or lower at loud convention raves so the bars or GIF react cleanly without maxing out constantly. Note that GIF mode also inherits your active Display Mode and Interpolation setting!

Once you're happy with your settings, tap "Start" to launch the full-screen visualizer. While running, both Boop Detection and Head & Motion Gestures remain fully active, so people can still boop your snoot while you're dancing!

A Few Quick Survival Tips for the Visualizer:

  • Bring a Portable Charger: Running real-time audio FFT processing at rave volume will give your battery a workout—keep a power bank in your pocket!
  • How to Exit: Simply triple-tap anywhere on the black visualizer screen (or use your phone's back-swipe gesture) to close the visualizer and return to the main menu.
Vocal Sync

To open Vocal Sync, tap and hold the Main Radial button and swipe RIGHT (3 o'clock).

While Vocal Sync looks similar to the Emote Panel, it maps your expression slots directly to the volume of your voice in decibels (dB) rather than manual button presses! This lets your visor automatically animate mouth movements as you talk, or dynamically swap expressions based on how loudly you speak (for example, showing a normal talking mouth at conversational volume, and automatically switching to an intense or angry face when you yell!).

Here is how to set up and use Vocal Sync:

  • The "Silent" Slot (0 dB): At the very top of your slot list, you will see a permanent default slot named "Silent" locked at 0 dB. This is your resting expression whenever you aren't speaking. To keep your baseline state unmistakable, the Silent slot cannot be deleted, renamed, or have its 0 dB threshold changed—just tap its "Upload" button to give it your default idle face or blinking GIF!
  • Adding & Ordering Custom Slots: Tap the blue "Add Sync Slot" button to create a new voice-triggered slot (initialized at 50 dB by default). Every time you add or edit a slot's decibel level, the app automatically sorts all of your slots from top to bottom in order of lowest to highest volume threshold.
  • Configuring Each Slot:
    • Upload: Tap "Upload" to assign a static image or animated GIF to that volume tier.
    • Rename: Tap "Rename" to give the slot a helpful label (like "Quiet Talk", "Normal Talk", or "Shouting").
    • Delete: Tap "Delete" and confirm the prompt to remove a custom slot.
    • Display Mode: Tap the mode button in the top-right corner of the slot card to cycle that specific slot between Duplicate (64x32 x2), Centered Across Both (128x32), and Mirror Right Side.
    • Set Activation Noise Level: Tap this green button to set the exact decibel (dB) volume required to trigger the slot. You can either type a number manually OR tap the "Auto Set" button and speak into your microphone at your target volume—the app will sample your voice for a couple of seconds and fill in the exact decibel number for you!
  • Back-Tracking & Step-Down Delay: At the top of the Vocal Sync screen, you'll see a toggle switch labeled "Back-Tracking" with a "Settings" button next to it:
    • When Back-Tracking is OFF: Stopping your speech causes the visor to snap immediately from whatever loud slot was active straight back to the "Silent" (0 dB) slot.
    • When Back-Tracking is ON: When you stop talking, the visor smoothly steps backward down through each intermediate volume slot in sequence until it reaches "Silent", creating a natural mouth-closing transition! Tapping the "Settings" button next to the toggle lets you set the exact Back-Tracking Delay in milliseconds (ms) between each step.
  • Launching & Running in the Background: Tap "Launch Vocal Sync" to start! A live decibel meter and reactive volume bar will appear right below the button, and the currently triggered slot will be highlighted with an "[ACTIVE]" tag. Built-in hardware noise suppression helps focus on your voice while filtering out background hum. Best of all, Vocal Sync continues running seamlessly even when you leave the screen or use your phone normally—just tap "Stop Vocal Sync" whenever you're ready to end the session.

Pro Tip: For the best responsiveness and isolation from crowd noise, I highly recommend pairing a small wireless clip-on Bluetooth microphone to your phone and mounting it inside your helmet right near your mouth!

Emote Panel

To open the Emote Panel, tap and hold the Misc. Radial button (the middle button on the main screen) and swipe UP (12 o'clock).

The Emote Panel is your dedicated expression soundboard! It lets you hotswap between unlimited static images and animated GIFs instantaneously—without needing to start a screen capture stream at all—and includes full wireless controller support so you can change your face while wearing bulky hand-paws.

  • Adding & Managing Emote Slots: Tap "Add Emote Slot" at the top of the page to create a new slot card. Each card includes:
    • Upload: Pick any static image or animated GIF from your device.
    • Rename: Change the slot's display name for easy reference.
    • Delete: Permanently remove the slot (with a confirmation prompt).
  • Per-Slot Display Mode (Gear Icon): Tap the gear icon in the top-right corner of any emote slot to set its individual Display Mode (Centered Across Both (128x32), Duplicate (64x32 x2), or Mirror Right Side). If you change the Display Mode of a slot card while a GIF emote is actively playing, the visor updates immediately; for static images, simply tap the slot's thumbnail once more to refresh it.
  • Controller Keybinds (Gamepad Icon): Right below the gear icon is a button with a controller icon. Tapping this opens the Controller Binding dialog:
    • Tap "Press to Listen for Input", then press any button, D-pad direction, bumper, trigger (LT/RT), or tilt either analog stick (Left Stick or Right Stick Up/Down/Left/Right) on your connected Bluetooth or USB controller!
    • Tap "Save" to lock in the binding (or "Clear Binding" to remove it).
    • As long as the Emote Panel screen is open, pressing that controller input will immediately push that emote straight to your visor! While it works with almost any standard gamepad, it is optimized and thoroughly tested for Xbox (X-Input) controllers.
  • Touch Activation: Don't have a controller handy? You can also just tap directly on any emote slot's thumbnail preview to send it straight to your visor!

A Quick Note on GIF Performance: Because the Emote Panel streams raw decoded frames directly over UDP, extremely heavy or high-framerate GIFs may play back slightly slower if there is heavy Wi-Fi interference. If a complex GIF feels sluggish in the Emote Panel, try simplifying the GIF or upgrading to a (better) external uFL antenna on your MatrixPortal S3. I've found in testing that complex GIFs occasionally perform better when used as static images, but this may not always be the case.

Drawing

To open the built-in pixel art studio, tap and hold the Misc. Radial button and swipe DOWN-LEFT (8 o'clock).

The Drawing suite lets you paint pixel art at your visor's exact native resolution! If your phone is currently connected to your Protogen's Wi-Fi, every single pixel stroke, flood fill, and edit you make on the canvas is streamed live to your physical visor in real time. Even if you aren't connected to your visor, the Drawing suite works 100% offline so you can design new faces anywhere.

  • Dual Independent Canvas Modes (128x32 vs. 64x32):
    At the top-left of the screen, a toggle switch lets you flip between "128x32 Mode" and "64x32 Mode". Each mode acts as its own completely separate workspace with its own independent Undo/Redo history—meaning switching between 128x32 and 64x32 won't erase or overwrite what you were drawing in the other mode!
    • 128x32 Mode: Spans across both visor panels, divided down the center by a magenta guide line. Labels above each half ("Right (Anatomical)" and "Left (Anatomical)") remind you which side is which when wearing the helmet. Tapping the "Swap Sides" button in the top-right flips the left and right halves visually inside the app's editor if you prefer working from a front-facing perspective, without altering how the final art appears on the physical visor.
    • 64x32 Mode: Automatically duplicates your 64x32 canvas onto both sides of the visor ("Both Sides"), and disables the "Swap Sides" button.
  • Pinch-to-Zoom & Two-Finger Pan:
    Working with tiny pixels on a phone screen is much easier when you can zoom in! Pinch with two fingers anywhere on the canvas to zoom in up to 10x for pixel-perfect detailing, and drag with two fingers to pan around your artwork.
  • Drawing Tools & Color Picker:
    Below the canvas, you have three primary drawing tools plus a live color button:
    • Pencil (✏️): Draw freehand pixels and continuous lines with a single finger or stylus.
    • Paint Bucket (🪧): Flood-fill any enclosed area or background with your active color.
    • Eraser (🧼): Wipe individual pixels back to black (off).
    • Color Button (Colored Circle on the Right): Tap this circle to open the "Pick Color" studio! Inside, you can drag across the gradient box, type an exact Hex Code (e.g., #FF00FF), tap any of your 5 "Recent Colors" swatches, or tap "Pick Color From Canvas" to turn your finger into an eyedropper and sample any pixel directly off your drawing! Tap "Apply" to lock in your color.
  • Full-Screen Landscape Mode:
    Need more room to draw? Tap the full-screen icon (⛶) in the top-right corner of the canvas border to rotate into a dedicated, edge-to-edge landscape view! While in full-screen mode, tap the small tab on the far-left edge of the screen to slide out your full tool drawer. Tap the corner icon again to return to portrait view.
  • Canvas Management, Importing & 4 Ways to Save:
    • Undo & Redo: Step backward or forward through your stroke history (up to 30 steps per canvas mode).
    • Clear: Wipes the active canvas clean (protected by a confirmation prompt so you never clear by mistake).
    • Import Image: Brings any existing image from your phone onto the active canvas, automatically centering and scaling it to fit vertically while preserving its aspect ratio.
    • Save as Static Image Slot / Save as Vocal Sync Slot / Save as Emote Panel Slot: Tapping any of these three buttons prompts you to name your creation, then automatically creates a brand-new slot in that feature populated with your drawing and takes you straight there!
    • Save as Image: Exports your pixel art directly to your phone's photo gallery as a crisp PNG file for backup or external editing.
5. Settings & Advanced Visor Features (Boop Sensor & Head Gestures!)

Tapping the gear icon in the top-right corner of the main screen opens the Settings page. This is mission control for customizing how ProtoStream looks, connects, and reacts to the physical world!

1. Help & Tour Guide

At the very top of Settings is the "Help & Tour Guide" card. Tapping this button opens a menu with Yen where you can either launch the complete onboarding tour from the beginning ("Give me the full tour!") or tap any of the 12 individual feature buttons (Connecting to Protogen, Main Radial Menu, Screen Streaming, Audio Visualizer, Vocal Sync, Misc Radial Menu, Emote Panel, Drawing Feature, Games Plugin Manager, Display Mode Radial Menu, Static Image Slots, or Settings Overview) to get an interactive guided walkthrough of just that specific tool.

2. Language (Localization)

For ease of access, ProtoStream automatically detects your phone's default language on first launch and supports 19 different languages—plus a secret 20th funny language—selectable at any time from the "Language" dropdown in Settings:

  • English
  • Simplified Chinese (简体中文)
  • Traditional Chinese (繁體中文)
  • Hindi (हिन्दी)
  • Spanish (Español)
  • French (Français)
  • Arabic (العربية)
  • Russian (Русский)
  • Portuguese (Português)
  • Indonesian (Bahasa Indonesia)
  • German (Deutsch)
  • Japanese (日本語)
  • Turkish (Türkçe)
  • Vietnamese (Tiếng Việt)
  • Korean (한국어)
  • Italian (Italiano)
  • Thai (ไทย)
  • Polish (Polski)
  • Dutch (Nederlands)
  • And a seekwit funni wanguage...

Note: Since I only fluently speak English, all other languages are translated and may contain occasional quirks. If you wish to help me improve the accuracy of any translation or want to help add your own language, feel free to reach out via the contact form at the top of this page!

3. ESP32 Wi-Fi Setup

Here you can update the Wi-Fi SSID (default: MatrixStreamer), Password (default: ProtoStream), and ESP32 Target IP Address (default: 192.168.4.1) that the app uses when connecting and streaming packets. Always tap the blue "Save" button at the bottom of the card after making changes! (Do not change the Target IP Address from 192.168.4.1 unless you are using the PC Emulator described below.)

4. Boop Detection (Snoot Boop Light Sensor & Controller Trigger)

Tapping the pink "Boop Detection" button in Settings opens a comprehensive setup panel that lets your Protogen react whenever someone boops your nose!

How Boops Are Detected:

  • Hardware Light Sensor (Automatic): If you plugged an Adafruit VEML7700 Ambient Light Sensor into your MatrixPortal S3 and positioned it behind your visor near the tip of your nose, the ESP32 samples ambient light every 50ms. Whenever someone's hand or finger gets close to your snoot and casts a shadow over the sensor, ProtoStream detects the sudden drop in light and triggers a Boop!
  • Controller Keybind (Manual): Don't have a light sensor installed, or want to trigger boop reactions yourself while wearing hand-paws? Under "Controller Keybind to Trigger a Boop", tap "Press to Listen for Input" and press any button, trigger, or stick direction on your controller. Pressing that input at any time will trigger a boop just like the physical sensor!
  • Test Boop Button: At the top-right of the Boop Detection menu is a green "Test Boop" button. Tap this at any time to simulate a boop and test your setup live!

Boop Detection Controls & Multi-Boop Combo Tiers:

  • Enable Boop Detection: Master toggle switch to turn boop reactions on or off globally.
  • Light Sensor Sensitivity (0%–100%): Adjusts how sensitive the VEML7700 light sensor is to shadows. Higher percentages make even a light, quick hand wave trigger a boop; lower percentages require a firmer, closer cover of the sensor.
  • Three Combinable Boop Action Modes: You can enable one, two, or all three of these switches at the exact same time to happen whenever you get booped:
    1. Image / GIF Overlay:
      Temporarily draws a custom reaction image or animated GIF right on top of whatever your visor is currently displaying (whether you're screen streaming, using Vocal Sync, in the Emote Panel, using the Audio Visualizer, or even just idling with no stream active!).
      • Overlay Opacity (0%–100%): Controls how transparent or solid the boop graphic appears over your current face.
      • Overlay Duration (ms): How long the boop graphic stays on your visor in milliseconds (default: 2000 ms, or 2 seconds). This also acts as your combo window for consecutive boops!
      • Boop Count Image / GIF Tiers (+ Add Boop Tier): Want your Protogen to get progressively more flustered—or annoyed—if someone keeps booping you over and over? You can create multiple Boop Tiers! Each tier has a "Boops in a row" number (e.g., 1, 2, 3, 5), its own "Display Mode" dropdown (Centered Across Both, Duplicate, or Mirror Right Side), and a "Select Image / GIF" button. If someone boops you repeatedly before the overlay duration expires, the combo counter climbs and automatically displays the matching tier's graphic!
      • Loop Back Toggle: Controls what happens when someone keeps booping you past your highest tier number. When Loop Back is ON, the counter wraps back around to Tier 1 and climbs up again; when OFF, it stays locked on your highest-numbered boop reaction until they stop booping you (unless they never stop booping you >:3c).
    2. Controller Keybind (Controller Keybind Sent When Booped):
      Lets a physical snoot boop simulate a controller button press inside the app! For example, you can bind this to an Emote Panel keybind or to Right Trigger (RT) so people at a convention can spin your ProtoSlots machine just by booping your nose!
    3. Launch Activity:
      Automatically opens a chosen screen in the app whenever you get booped (Main Screen, Audio Visualizer, Vocal Sync, Emote Panel, Drawing, Games Plugin Manager, or Custom Games).
5. Head & Motion Gestures (Built-In Accelerometer Recognition)

Right below Boop Detection is the cyan "Head & Motion Gestures" button. Because the Adafruit MatrixPortal S3 has a built-in 3-axis accelerometer (LIS3DH), ProtoStream can track how your head moves in 3D space and trigger custom visor overlays, controller inputs, or app screens whenever you perform specific head movements (like tilting your head, nodding, shaking your head, or even sprinting!).

Step 1 — Calibrate Your Helmet's Mounting Angle:
Because every builder mounts their circuit board at a slightly different angle inside their head, the top of the Head & Motion Gestures menu features two quick calibration buttons (which also calibrate gravity for the ProtoPhysics game!):

  • 🎯 Calibrate Flat Position: Put your head on, stand straight facing forward in your normal resting posture, and tap this button.
  • 🔽 Calibrate Pointed Straight Down: Tilt your head/snout 90 degrees straight down toward the floor and tap this button. This teaches the app the exact 3D orientation of your visor!

Step 2 — Create & Record Gesture Slots:
Tap "+ Add Gesture Slot" to create a new custom gesture. Each slot is neatly housed in its own collapsible dropdown card with the slot's name displayed across the top header bar (along with a "✓" checkmark once a gesture has been recorded). Tap any slot's top bar to expand (▼) or collapse (▶) its settings:

  • Rename, Test & Delete: At the top of the expanded slot, you can rename the gesture, tap the green "Test" button to fire its actions immediately, or delete the slot.
  • Record Gesture (1.5-Second Motion Capture): Tap the purple "Record Gesture" button. It will turn orange and say "Recording (1.5s)... Move now!"—immediately perform your head movement (such as a sharp head tilt to the left, a double nod, or a head shake). The app automatically trims out any reaction-time delay at the start and end of the 1.5-second window and saves your 3D motion waveform!
  • Hold Overlay While Motion Continues (Sprinting): When this switch is turned ON, your gesture overlay will stay active on your visor continuously for as long as you keep repeating the motion (perfect for sprinting, dancing, or headbanging animations!). When OFF, the gesture triggers once for its set duration followed by a brief cooldown so movements don't accidentally double-fire.
  • Variance Threshold (1%–100%): Adjusts how forgiving the 3D gesture matcher is. If a gesture feels too strict to trigger, slide the Variance Threshold slightly higher; if it triggers too easily during normal head movement, slide it lower. I have found that ~80% is the sweet spot, but try out different thresholds and see what's right for you.
  • Three Combinable Gesture Actions: Just like Boop Detection, each individual gesture slot has its own toggles for:
    1. Image / GIF Overlay (with its own custom image/GIF, Display Mode, Opacity slider from 0%–100%, and Duration in ms)
    2. Controller Keybind (sends a virtual controller button/trigger press when you perform the head gesture)
    3. Launch Activity (launches any chosen ProtoStream screen when you perform the gesture)
6. Interpolation (Scaling Mode)

In Settings, the "Interpolation (Scaling Mode)" card lets you choose the mathematical algorithm used to scale your phone's screen or uploaded images down to the visor's 128x32 / 64x32 resolution. If you've used art programs like Photoshop, GIMP, or Aseprite, these will sound very familiar:

  • None (1:1): Does not scale the image at all; instead, it crops the exact center 128x32 (or 64x32) pixels. Ideal if you are displaying native-resolution pixel art at 1:1 scale.
  • Nearest-Neighbor: Scales images while preserving hard pixel edges with zero blurring. Ideal for pixel art and retro graphics that you want to stay crisp and blocky.
  • Bilinear: Smooths out edges by blending neighboring pixels together. Ideal for photographs, smooth illustrations, or general screen streaming.
  • Bicubic (High Quality): Uses a sharper multi-pixel sampling algorithm to preserve finer gradients and detail when scaling down high-resolution images.
7. Display Mode Radial Menu Toggle & Radial Menus Customization

At the bottom of Settings, you have complete control over how your main screen's radial menus behave:

  • Show Display Mode Radial Menu: By default, this switch is ON, placing the third radial button (Display Mode) at the bottom of the main screen. If you turn this switch OFF, the third radial button is hidden from the main screen to save space, and a classic list of Display Mode radio buttons appears right inside this Settings card instead!
  • Radial Menus Customization: This table lists all seven core tools (Start Live Screen Streaming, Stop Streaming / Clear, Audio Visualizer, Vocal Sync, Emote Panel, Games Plugin Manager, and Drawing). For each tool, you can use the two dropdowns to assign:
    • Menu: Choose whether the tool lives on the "Center" (Main) wheel, the "Misc" wheel, or set it to "Hidden" if you don't use it! (Note: Start Live Screen Streaming and Stop Streaming / Clear can only be moved between Center and Misc, and cannot be hidden.)
    • Position (1 to 12): Choose the exact clock-face position (1 = 1 o'clock, 3 = 3 o'clock/Right, 6 = 6 o'clock/Down, 9 = 9 o'clock/Left, 12 = 12 o'clock/Up) where that icon appears on the wheel! If you pick a position that another tool is already using on the same wheel, the two tools automatically swap places.
    • Reset to Default: Tap the red "Reset to Default" button at the bottom of the card to restore all radial buttons to their factory layout.
6. Testing the App Without an ESP32 (PC Emulator)

If you haven't purchased your ESP32 hardware yet—or you're waiting for parts to arrive in the mail—and want to test out ProtoStream's features right now, I have a solution! I wrote a Python script (esp32_matrix_emulatorv###.py) that creates a virtual 128x32 ESP32 Matrix Emulator right on your computer monitor, allowing you to see how your phone screen, emotes, drawings, and games map to the visor.

To set up the PC emulator:

  1. Ensure Python is installed on your PC. You can download it here.
  2. Open your PC's Command Prompt (cmd) and run the following command to install the required math and imaging libraries:
    pip install numpy opencv-python

    (Note: If Command Prompt states that "pip" is not a recognized command, try running python -m pip install numpy opencv-python instead.)

  3. Once the installation finishes, run the emulator Python file to launch the virtual visor display window on your monitor.

To pair your phone with the PC emulator:

  1. Ensure both your phone and your PC are connected to the exact same home Wi-Fi network. (Note: this may or may not work on public networks such as those in a college/university dorm room. Sorry college students!)
  2. Find your PC's local IPv4 address: open Command Prompt on your PC, type ipconfig, and press Enter. Look for the string of numbers next to "IPv4 Address" (for example, 192.168.1.15).
  3. Open the ProtoStream app on your phone and tap the Settings gear icon in the top-right corner.
  4. Scroll to the "ESP32 Wi-Fi Setup" card, replace the default 192.168.4.1 in the "ESP32 Target IP Address" box with your PC's IPv4 address, and tap "Save".

After that, any stream, emote, drawing, or game you launch in the app will stream live to the virtual visor on your computer screen! (Just remember to change the Target IP Address back to 192.168.4.1 when you switch back to a real physical ESP32 visor.)

Troubleshooting Steps for Linux

Note: This emulator script was not built with Linux in mind. I highly recommend using a Windows 10/11 PC instead if you have one available. If you are running the Python emulator in a Linux environment, you might run into some quirks with firewalls or display backends. Please note that I am not deeply familiar with Linux myself, so I likely will not be able to assist further if these steps do not resolve your issue!

Here are the common fixes if things act up on Linux:

  • UDP Firewall Blocking (Port 2811): If the emulator window opens but no frames appear when streaming from your phone, your Linux firewall (UFW) may be blocking incoming UDP packets. Allow incoming traffic on port 2811 by running:
    sudo ufw allow 2811/udp
  • Missing GUI Dependencies (libGL errors): If OpenCV complains about missing OpenGL libraries (like libGL.so.1), install the standard GUI packages on Debian/Ubuntu-based distributions via terminal:
    sudo apt update && sudo apt install libgl1 libglib2.0-0
  • Display Server & X11/Wayland Issues: Ensure you are running an active desktop graphical session and that your DISPLAY environment variable is set. If you are running headless over SSH without X11 forwarding enabled, OpenCV won't be able to spawn the emulator window.
  • Window Manager Freezing: The emulator script includes built-in socket timeouts to prevent GUI freezes when no packets arrive, but if your window manager still hangs, ensure your OpenCV package is up to date:
    pip install --upgrade opencv-python
7. You Got Games on Your Proot? (Games Plugin Manager)

While you can stream any mobile game from your phone's screen to your visor, most modern phone games aren't designed to be readable at a tiny 128x32 pixel resolution. To solve that, I built a dedicated visor arcade called the Games Plugin Manager!

To open it, tap and hold the Misc. Radial button on the main screen and swipe DOWN-RIGHT (4 o'clock).

Here, you can download, configure, and launch official companion games written specifically for the visor's 128x32 resolution, play with the built-in accelerometer physics sandbox, or import custom community-made games!

  • Note on Installing Official Game Plugins: ProtoTetris, ProtoFish, and ProtoSlots are downloaded as lightweight plugin packages directly inside the Games Plugin Manager by tapping "Download Plugin" (requires an internet connection). The first time you install a plugin, Android may prompt you to allow ProtoStream to "install unknown apps"—this is a standard Android security step for in-app plugin installers, so simply toggle it on and confirm the install. Once installed, the button changes to "Uninstall" (in case you ever want to remove it), and the green "Launch" button lights up! (Fun fact: the plugins are actually hosted right here on the site you are looking at!)
For Advanced Users: Custom Games (.protogame Importer)

Are you familiar with Java? ProtoStream includes a full Custom Games engine that lets you write your own 128x32 visor games in Java, compile them into portable .protogame files, and share them with anyone else who uses ProtoStream!

  • How to Import & Play: Inside the Games Plugin Manager, tap the purple "Custom Games" button near the top of the screen. Next, tap "Import .protogame" and select any .protogame file on your phone. Once imported, tap "Launch" to play!
  • Built-In Touch & Physical Controller Support: When you launch a Custom Game, ProtoStream opens a dedicated host screen displaying a live preview of the 128x32 visor at the top and a built-in on-screen touch controller underneath (D-Pad Up/Down/Left/Right, Select, Start, B, A, and an Exit button). If you have a wireless Xbox/Bluetooth controller or keyboard connected, the host automatically maps your physical D-pad/left stick and buttons to the game as well!
  • Build Your Own: Interested in making your own visor game? Check out the official ProtoStream Dev Kit and documentation on GitHub.
ProtoTetris

ProtoTetris is a custom-built block puzzle game tailored specifically for the visor's 128x32 dual-matrix layout! The game splits your visor into two halves:

  • Left Visor Panel: Displays the main playfield where you maneuver and stack falling tetrominoes.
  • Right Visor Panel: Displays your current score, a preview of the NEXT tetromino, and your currently HELD tetromino.

ProtoTetris requires a wireless or wired Xbox/Bluetooth controller connected to your phone. It features two play orientation modes: VERT (Top-Down) and HORZ (Left-to-Right), which you can select on the title screen using the Left Stick or D-Pad before pressing A to start:

  • Left Stick / D-Pad: Move the falling tetromino left/right (or up/down in HORZ mode) and soft-drop.
  • A or B Button: Rotate the tetromino clockwise.
  • X or Y Button: Swap the current tetromino into the Hold slot.
  • Hard Drop: In VERT mode, press Up on the Left Stick or D-Pad to instantly drop and lock the piece at the bottom. In HORZ mode, press Left on the Left Stick or D-Pad to instantly drop the piece to the far side of the board.
  • Menu Button (☰): End the current run and return to the mode selection title screen.

Your high score is saved automatically on your device, so you can always try to beat your personal best or hand your controller to friends at conventions to challenge your record! To exit ProtoTetris and return to the Games Plugin Manager, simply triple-tap anywhere on your phone screen (or use your phone's native back-swipe gesture).

ProtoFish

ProtoFish is a complete, custom-built fishing RPG designed specifically for the visor's 128x32 resolution! Cast your line, battle fish with directional rod tension, earn cash, upgrade your gear, travel to exotic ponds, and complete a massive 96-entry Fish Index!

I want to give a special thanks to Xevi for creating many of ProtoFish's assets.

Like ProtoTetris, ProtoFish is played using a wireless or wired Xbox/Bluetooth controller paired to your phone. To exit the game and return to the Games Plugin Manager at any time, simply triple-tap anywhere on your phone screen.

1. General Gameplay & Fishing Mechanics

When you aren't inside an upgrade or save menu, your visor displays your active fishing spot split across the two panels:

  • Right Visor Panel (Left side of your phone preview): Displays your current money balance while waiting for a bite.
  • Left Visor Panel (Right side of your phone preview): Displays the pond where you are actively fishing.

Wait by the water until a bite indicator appears, then press the A Button on your controller to hook the fish! Once hooked, the right visor panel transforms into your active fishing dashboard with two meters:

  • Catch Progress Meter (Horizontal bar along the bottom): Slowly fills up while you keep the fish under control. Fill it completely to land the catch! If you lose control of the fish, this meter steadily drains.
  • Positioning Meter (Vertical bar): Contains a moving red dot representing the fish's position and a green bar segment under your control. Hold down the Right Trigger (RT) on your controller to raise your green bar, and release RT to let it fall. Whenever your green bar is hovering over the red dot, your Catch Progress Meter fills!
  • Directional Rod Pulling Bonus: While reeling with RT, keep an eye on the pond panel where the fish is physically swimming around. You will see a bright yellow line projecting out from the fish showing the exact direction it is trying to flee. Push your controller's Left Stick in the OPPOSITE direction of that yellow line to pull against the fish—doing so grants a massive speed bonus to your Catch Progress Meter whenever your green segment is aligned with the red dot!
2. The Upgrades Panel (Menu Button ☰)

Pressing the Menu Button (☰) on your controller opens the Upgrades Panel. Use the D-Pad to browse items in the current tab, press A to purchase or inspect, and press the Left Bumper (LB) or Right Bumper (RB) to switch between the four tabs:

  • ROD (Rod Upgrades): Purchasing stronger rods causes your Catch Progress Meter to fill much faster whenever your green segment is over the red dot.
  • BAT (Bait Upgrades): Upgrading your bait increases the physical size of your green segment on the Positioning Meter, making it much easier to keep the fish tracked.
  • PND (Pond Travel): Unlock and travel to new pond locations featuring rarer, harder-fighting, and much more lucrative fish species.
  • IDX (Fish Index): Your personal encyclopedia of every species you've caught! Press A on any unlocked entry to view a full visor preview of the fish, and tap Right on the D-Pad while viewing a fish to inspect its rare Shiny variant (marked with a yellow star next to the entry once caught).

Important Note on Equipment & Ponds: All upgrades—including pond unlocks—are automatically equipped immediately upon purchase! Because you will always fish in the highest-tier pond you have unlocked, if you are a completionist aiming to catch 100% of the index, make sure you catch every species in your current pond before purchasing the next pond upgrade!

3. Saving & Loading — The Saves Panel (View Button ⧉)

Pressing the View Button (⧉) on your controller opens the Saves Panel. Pay close attention to this feature!

ProtoFish uses a unique, universal, 43-input password save system. Instead of locking your save file to a single phone or requiring an internet server, your entire game state (money, rod, bait, unlocked ponds, and every caught fish and shiny in your index) is encoded live into a 43-input controller code made up of:
D-Pad Left, D-Pad Right, D-Pad Up, D-Pad Down, A, B, X, and Y.

Whenever you open the Saves Panel, your current 43-input save code is displayed right on screen—always snap a photo or write down your code before closing the game! Because the code is universal, you can enter it later on any device running ProtoFish to restore your exact progress.

How to Load a Save Code:

  1. Press the View Button (⧉) to open the Saves Panel.
  2. Press the 43 directional and face button inputs on your controller in exact order. A counter in the bottom-left corner tracks how many inputs you have entered so far.
  3. Once all 43 inputs are entered, press the Right Trigger (RT) to submit the code and load your save! (If you make a typo while entering the sequence, just press the View Button ⧉ twice to close and reopen the panel, which resets the input counter.)
  4. Lost your save code—or want to experiment with a custom loadout? You can generate a valid 43-input code at any time using the online ProtoFish Save Generator.
4. Ponds & Species Overview

ProtoFish features 48 unique fish species across its ponds, and every single species has its own rare Shiny variant—bringing the true 100% completion total to 96 fish! Every pond is also home to one legendary "Unique Fish" boss species that is far rarer than standard fish (and yes, the Unique boss fish have Shiny variants too!).

ProtoSlots

Who doesn't like a little convention gambling? ProtoSlots is a customizable slot machine game built for your visor—perfect for running interactive prize giveaways at conventions or just spinning for fun!

Unlike ProtoTetris and ProtoFish, ProtoSlots can be played EITHER with a connected Xbox controller OR simply by tapping directly on your phone screen!

1. Slots Settings & Customization

Once ProtoSlots is installed in the Games Plugin Manager, a Gear Icon button appears right next to its Uninstall button. Tap this gear icon before launching the game to open the "Slots Settings" studio:

  • Dud Slots (0–5): Enter a number from 0 to 5 at the top to control how many "X" dud symbols are mixed into the reels. Even if someone lands four X's across the visor, duds never award a jackpot—letting you fine-tune how hard it is to win!
  • Default Giveaway Slot Types: Below the duds are three pre-made slot symbols with their own enable/disable checkboxes: Sticker, Money, and Candy. These come with built-in (really-bad-because-I-can't-draw-for-SH—) pixel art symbols and are designed for common convention table or fursuit walk-around giveaways!
  • 3 Custom Slots: Want to add your own prizes, character art, or inside jokes? Below the defaults are three fully customizable slots (Custom 1, Custom 2, and Custom 3) that you can toggle on or off:
    • Rename: Tap "Rename" to set the slot's prize name. Whatever name you type here is the exact text that will scroll in giant letters across your visor when someone hits a 4-of-a-kind jackpot on that symbol!
    • Select Image: Tap "Select Image" to pick any static image or animated GIF from your phone to use as that slot's reel icon. A pixelated preview box right next to the button shows how it will look scaled down on the reel! (Note: Animated GIFs may appear static inside the small settings preview box, but they will animate smoothly inside the actual slot machine game!)
  • Presets Manager: Near the bottom of the Slots Settings window, you can save different machine setups (for example, "Easy Con Giveaway" vs. "Hard Jackpot Mode") by tapping "Save Preset" and entering a name. Your saved presets appear as buttons at the bottom—tap any preset button to load its configuration into the editor, or tap-and-hold a preset button to Rename or Delete it.
  • Apply Button: Whenever you finish tweaking your symbols or loading a preset, tap the green "Apply" button at the bottom! This flashes your configuration to ProtoSlots, and the game will remember and use those exact settings every time you launch it until you change them again.
2. Playing & Closing ProtoSlots
  • Spinning the Reels: Once launched, simply tap anywhere on the slot machine screen—or pull the Right Trigger (RT) on a connected Xbox controller—to spin!
  • Exiting the Game: Tap the "✖" button in the top-left corner of your phone screen to close ProtoSlots and return to the Games Plugin Manager.
ProtoPhysics (Built-In Accelerometer Particle Sandbox)

ProtoPhysics comes pre-installed right inside the Games Plugin Manager—no separate plugin download required! It turns your 128x32 visor into a live, interactive falling-sand and particle physics simulation driven by the 3-axis accelerometer built into your Adafruit MatrixPortal S3 (or your phone's internal tilt sensors if you are testing without an ESP32).

As you tilt your head left, right, up, or down, hundreds of glowing pixels pour, stack, and slide across both sides of your visor in real time like digital neon sand!

1. ProtoPhysics Settings (Gear Icon)

Tapping the Gear Icon next to ProtoPhysics's Launch button opens the "ProtoPhysics Settings" studio:

  • Accelerometer Calibration (Shared with Head Gestures):
    • 🎯 Calibrate Flat Position: Stand straight facing forward and tap this button so the simulation knows your level resting posture.
    • 🔽 Calibrate Pointed Straight Down: Point your snout straight down toward the floor (90 degrees) and tap this button. Once calibrated, tilting your head straight down at the floor causes all the sand particles to pour toward the center and form a neat vertical line right down the middle seam between your two visor panels!
  • Invert Head Tilt Direction: A checkbox that flips the left/right gravity response if your board mounting orientation requires it.
  • Number of Particles (10 to 800): Drag this slider to choose how many particles spawn inside your visor (default: 240).
  • Particle Size (1 px to 4 px): Choose between fine 1-pixel grains of sand, medium 2-pixel particles, or chunky 3-to-4-pixel blocks.
  • Color Modes & Custom Weighted Palette Builder:
    • Rainbow Particles: When checked, particles automatically span the full rainbow spectrum.
    • All Particles Use Random Colors: When checked, every individual particle is assigned a randomized vibrant color.
    • Particle Colors & Percentages (+ Add Particle Color): When neither Rainbow nor Random is checked, you can design your own custom multi-color particle mix! Tap "+ Add Particle Color" to add as many color rows as you want. In each row, you can tap the colored square swatch to cycle through preset neon colors, type any custom Hex Code (like #06B6D4 or #EC4899), and drag that color's percentage slider (0%–100%) to control what proportion of the particles use that color! Tap "Save" at the bottom to lock in your setup.
2. In-Game Controls & On-The-Fly Calibration

Tap "Launch" to start the simulation in full-screen landscape mode! At the top-left of your phone screen, you'll see three overlay buttons:

  • ✖ (Close): Exits ProtoPhysics and returns to the Games Plugin Manager (you can also press Back or the B button on a connected controller).
  • 🎯 Calibrate: Immediately recalibrates your neutral Flat Position without leaving the simulation.
  • 🔽 Straight Down: Immediately recalibrates your 90-degree floor-pointing Down direction on the fly.

Report a Bug

× Enlarged view
< (C)
ProtoStream Screenshot
The ProtoStream app's home screen.
Image 1 / 13
(X)
Downloads Panel
ProtoStream ESP32 Firmware (.txt) ProtoStream App (.apk) ESP32 Matrix Emulator (.py) ProtoStream Source Code Arduino IDE Python Protogen Head Guide →
Click here to quickly access all download links for the project!
Click here to view helpful images as you progress through the guide!