An uncompromisingly fast, small, modern, and feature-rich custom firmware for A23/A33-based handheld consoles.
Important
This is not a goodluckOS distribution. For goodluckOS, use the official project: CodeZombie/goodluckOS.
This fork is my personal workspace. I use it to improve my own console (a GA36-MB v1.1, A33) and to prepare contributions, which I offer upstream as small pull requests, only the ones Jeremy wants. It is not meant to compete with goodluckOS or to be installed by anyone else: there are no releases or images here, and none are planned. Everything in it was written with an AI coding assistant (Claude Code), has only run on my device, and is still being reviewed. What it changes, and where each change stands, is in the fork status discussion.
Important
goodluckOS is BETA software. You will run into bugs!
Please visit The Firmware Builder. This will walk you through the steps of identifying if you have a compatible unit, and building a flashable goodluckOS image.
- Mainline Linux 7.2
- Everything compiled from scratch with the best optimization flags for the hardware
- Optimized for performance. No systemd, no unecessary background processes, no x11/wayland
- Significantly smaller and faster than the stock firmware
- Boots in 10 seconds (stock firmware takes 50)
- Can be flashed to a 1gb SD card and still give you over 500mb of free space for games
- ZRAM enabled by default
- Hardware accelerated graphics
- Speaker and headphone audio. The speaker gets a high-pass filter, so it stays clean instead of distorting on bass it can't play
- Great battery life
- A low battery warning over any game at 15% and 5%. At 2% the game is closed, saving as when you quit it, and the console shuts down cleanly before the battery cuts out
- No swap on SD card (massively improves the life of your card over the stock f/w)
Resize Home(System Settings -> Storage) grows your HOME partition to fill all the available space on your microSD card.- Volume buttons change the volume and FN+Vol the screen brightness from anywhere, with a level bar shown over whatever is on screen: the launcher, the settings or any game
- Optional in-game status bar with the CPU and power chip temperatures, the date and time, the battery, the volume and the audio output, over any game
- Date and time with a time zone, kept while the console is off, shown in the launcher and the status bar (12/24-hour, several date formats)
- Brightness, volume and CPU mode are kept across reboots
- SELECT+START closes the active application cleanly (RetroArch saves first), bringing you right back to the launcher
- FN+START+SELECT force-kills the active application
- FN+DPAD_UP toggles a live FPS/CPU graph for monitoring in-game performance. What it shows, its style and its corner are set in System Settings -> Overlay.
- FN+DPAD_DOWN switches the sound between the speaker and the headphones only (the console can't detect the headphone jack)
- If the screen is on, the LEDs are off. Nothing blinding you while you're playing in the dark
- Comes stock with Chocolate Doom, ready to play
- Second SD card (TF-2 slot) for more games, with its own launcher tab
- Music and video player (mpv): Music and Videos tabs in the launcher, played full screen with the console's buttons, with speed (0.25x to 2x) and zoom (up to 4x, moved with the right stick) for videos
- Comes stock with Retroarch and several optimized cores (PCSX-ReArmed, Snes9x, QuickNES, DOSbox, Genesis Plus GX, mGBA, etc)
- Games perform very well. Metal Gear Solid 1 is completely playable at reasonable framerates
- Comes with a custom, optimized launcher application, with tabs per system, search, favourites and game artwork/descriptions from
gamelist.xml - System Settings, in the launcher: brightness, volume, audio output, launcher options, language, interface font, overlay, date and time, storage (second card, trash, Resize Home), power mode (Battery saver, Balanced, Performance), system info, a button tester and a restore of the default settings
- Translatable interface, with English and Brazilian Portuguese included (see Translations)
- Autostart any application on boot, including games or a front-end like EmulationStation (coming soon)
- USB terminal access for remote debugging. Log in with
sudo screen /dev/ttyACM* 115200androot:root - HOME shows up on your PC over USB (MTP), like a phone: copy games and saves without taking the SD card out
- Half Life 1 ported and playable: Get It Here
goodluckOS gives you a direct line into the operating system from your desktop PC so you can edit system files, monitor processes, debug configurations, etc.
To use it:
- Plug your console into a Linux PC with a usb cable via the OTG port.
- Open a terminal and run
sudo screen /dev/ttyACM* 115200 - When prompted, enter the credentials (username:
root, password:root)
Check out the Firmware Builder for instructions and video guides.
You'll need a backup of at least the first 128mb of the original microSD card that came with your device.
Don't have the original microSD card? Open an issue here on github, we have microSD card dumps for several hardware variants, and one of them may work for you. We'll get you sorted out.
Once it's installed, System Settings -> Storage -> Resize Home expands your HOME partition to fill all the remaining space on your SD card. Do it before copying your games: HOME is backed up to RAM while it's resized. You only need to do this once.
- Headphone auto-detection. We have reason to believe some GA36-MB variants simply lack the hardware to do this.
- More LibRetro cores
- Fine tune existing LibRetro cores for best performance.
- Portmaster (or equivalent)
- EmulationStation (as an optional replacement for Puppy)
- USB Networking
- CPU Overclocking
- Portable Puppy for other firmwares (see below; config file, es_systems.cfg support and runner done)
Puppy can also run as an optional frontend on other handheld firmwares that use EmulationStation (e.g. dArkOS on the original R36S, ROCKNIX, Knulli), next to the existing frontends rather than replacing them. Progress:
- Config file (
puppy.conf) - done: fonts, assets, languages, whereapps.puppy, the cache and the settings live, and the commands for restart / power off / display off / settings. Without one, Puppy uses the goodluckOS defaults, so goodluckOS works exactly as before. Puppy reads the file given with--config, else$PUPPY_CONFIG, else/etc/puppy.conf. A documented example is inrootfs/package/puppy/portable/puppy.conf. - Systems from
es_systems.cfg- done: the tabs come from the EmulationStation system list the firmware already has (folders, extensions and launch commands, with%ROM%,%BASENAME%,%SYSTEM%, and the default%EMULATOR%/%CORE%of ES forks that have a core choice), so it works with no manual setup. Systems without games are left out, and scrapedgamelist.xmlcollections work as on goodluckOS. - Self-contained launching - done:
puppy-run.shshows Puppy, runs what was picked and comes back, like appd does on goodluckOS (there Puppy launches throughappctl; puppy.conf's emptylaunch_commandswitches to the launch file). A "Quit Puppy" power option (quit = on) goes back to the frontend Puppy was started from. Without a settings app, START opens the power options. - aarch64 build and packaging - to do: 64-bit builds for RK3326 devices (built against an older glibc, or with the libraries shipped next to Puppy in
libs/), an install script, and a PortMaster package.
The portable folder looks like this: puppy, puppy-run.sh, puppy.conf, assets/ (Inter_24pt-Medium.ttf, fallback.png), lang/ (the .lang files) and an optional apps/ folder of *.puppy files. So far it has been tested only on a PC with an ArkOS-style es_systems.cfg. Step 4 needs testers with an original R36S or other RK3326 device: if that's you, open an issue!
Every known variant of the GA36-MB is supported. There are many more Allwinner A23/A33 devices that will almost certainly work, but without the hardware it's hard to say for certain.
The GA36-MB family of devices ship with at least two different display panels. gooduckOS supports both, but we haven't yet found a good way to determine which panel you have ahead of time. For now, just try both until one works.
If the Firmware Builder tells you your device is not supported, you may have a new variant we've never seen before. In that case, send us your script.bin file so we can verify that goodluckOS is safe for your device. We'll update you when we support it.
- R36MAX
- F35v
- Other A23/A33-based devices
Know of another Allwinner-based handheld not listed on this page? Open a new Issue and let me know!
If you have one such device, and some spare time, leave an issue on Github and we'll work with you to build support for it, and get it running on your hardware.
Alternatively, consider contributing to the Device Fund so we can purchase new consoles and port goodluckOS to them.
Puppy is goodluckOS' application launcher. It's what you see when you start goodluckOS. It was designed to be simple, flexible, and most importantly: fast.
| Grid view | List view |
|---|---|
| Search (X): the on-screen keyboard filters every tab as you type | |
The top bar shows the volume (a headphones icon when the sound goes to the headphones only) and the battery, whose level turns yellow while charging, green when full and red at 10% or less.
Changing the brightness (FN+Vol) or the volume shows a level bar for a moment, and FN + D-pad down shows the audio output. It is drawn by the graphics driver (a patch to Mesa's Gallium HUD), so it looks the same over the launcher, the settings and every game:
| Brightness | Volume | Audio output |
|---|---|---|
Puppy works with appd to ensure it's never running when you launch an application. This ensures all of your RAM and CPU resources are available to your game, not an idle launcher.
Puppy uses a ini-formatted apps.puppy files to populate it's application list.
Add a new entry by modifying the apps.puppy file in your HOME partition. Take a look at the comments at the top of that file for syntax/examples
Works with scraped collections: point Skraper (or anything that writes EmulationStation's gamelist.xml) at your rom folders and Puppy shows the games' names, artwork, descriptions and year/genre/players, no conversion needed (see How do I add games?).
Each system and app category gets its own tab, plus an "All Games" tab with every system's games and the native ports of the Games tab (tagged "Ports"), a "My List" tab with your favourites and, once you've played something, a "Recent" tab with the last 30 games you opened, newest first. The strip at the top shows five tabs of the same width, the current one in the middle, and wraps around. Controls:
| Button | Action |
|---|---|
| L1 / R1 | Previous / next tab |
| D-pad / left stick | Move (hold to scroll). In list view, left/right jump a page |
| Right stick up/down | Scroll the game's description (list view) |
| A | Launch |
| Y | Add to / remove from My List (your favourites tab) |
| SELECT | Set / clear autolaunch |
| L2 + R2 | Game options: Rename the game with the on-screen keyboard, starting from the name it shows (L1/R1 move the cursor, Aa types capitals): the shown name changes and the file takes a version of it the card accepts (":" becomes " -"), with its cover, gamelist entry and RetroArch saves following, or Move to trash (HOME/.trash; a .cue's tracks and a .m3u's discs go with it). System Settings empties the trash |
| X | Search by name with the on-screen keyboard (the search applies to every tab) |
| B | Clear the search, or close the keyboard / power options |
| START | System Settings |
| POWER | Power options: display off, restart, shut down (these two ask first) |
With System Settings -> Input Settings -> Confirm button on B, A and B swap.
Grid or list view, whether the tabs are shown and which ones are set in System Settings. In list view, a selected name that doesn't fit scrolls to show the rest.
| Buttons | Action |
|---|---|
| VOL+ / VOL- | Volume, with an on-screen level bar |
| FN + VOL+ / VOL- | Brightness, with an on-screen level bar |
| POWER | Screen off / on (in the launcher it opens the power options) |
| SELECT + START | Close the active app cleanly (RetroArch saves first) and go back to the launcher |
| FN + SELECT + START | Force close the active app |
| FN + D-pad up | Show / hide a live FPS and CPU overlay |
| FN + D-pad down | Sound on the speaker or on the headphones only (the console can't detect headphones, so this is manual) |
FN is the hotkey:
| Buttons | Action |
|---|---|
| FN + X | RetroArch menu |
| FN + R1 / L1 | Save / load state |
| FN + LEFT / RIGHT | Previous / next state slot |
| FN + Y | Pause |
| FN + R2 | Fast forward |
| FN + L2 | Screenshot, saved in HOME/.config/retroarch/screenshots |
| FN + START | Quit the game |
The same list is in System Settings -> Input Settings, next to a button tester.
Opened with START from the launcher, which it is part of: there's no loading screen on the way in or out, and the launcher comes back as you left it. The sections are on the left, and the page of the selected one on the right:
System Settings
├── Display & Audio
│ ├── Brightness
│ ├── Master Volume
│ ├── Global Mute
│ └── Audio output: Speaker / Headphones
├── Launcher
│ ├── Show launcher tabs
│ ├── Launcher view: Grid / List
│ └── Launcher tabs ─ which tabs to show
├── Interface
│ ├── Language
│ ├── Font
│ ├── Accent color ─ the highlight colour, from a list of 8
│ └── Show Puppy on loading screens (off: a plain "Loading..." while a game starts)
├── Overlay
│ ├── In-game status bar: Show date
│ ├── Show time
│ ├── Show battery
│ ├── Show audio
│ ├── Show CPU temperature
│ ├── Show power chip temperature
│ ├── Opacity
│ ├── Performance (FN + UP): Show on game start
│ ├── Content: FPS / FPS + CPU
│ ├── Style: Graph / Text
│ └── Position: top or bottom, left or right
├── Date & Time
│ ├── Now: the current date and time
│ ├── 24-hour clock
│ ├── Date format
│ ├── Year, Month, Day, Hour, Minute
│ ├── Set date and time
│ └── Time zone
├── Storage
│ ├── HOME usage
│ ├── Resize Home ─ the card's and HOME's sizes, and the resize
│ ├── Second card: usage, Eject card / Detect card
│ └── Empty trash
├── System
│ ├── Power mode: Battery saver / Balanced / Performance
│ ├── System Info
│ └── Restore default settings
├── Input Settings
│ ├── Confirm button: A (right) / B (bottom)
│ ├── Shortcuts ─ every shortcut
│ └── Button Tester
└── Credits ─ the people who made goodluckOS
- Launcher tabs: hidden tabs' games still appear in All Games and My List.
- Font: Default (Inter), VT323, Pixelify Sans or ProggyClean.
- Accent color: the colour of the selection, the buttons in the hints and the bars, and of the volume and brightness feedback in games (from the next game on): yellow (the default), orange, red, pink, purple, blue, cyan or green.
- In-game status bar: the CPU temperature, the power chip (AXP223) temperature, the date, the time, the battery and the volume and audio output, each one on or off, in the top right corner of every game, with the launcher's icons; Opacity sets its background. All off by default, so nothing covers the game. The launcher keeps its own top bar.
- Performance: the Gallium HUD graphs that FN + D-pad up shows in game. Text only goes at the top.
- Overlay changes apply from the next game on.
- Date & Time: the date format and 12/24 hours (12-hour by default) of the launcher's top bar clock, which always shows the date and the time, and of the in-game status bar, which shows what Overlay turns on. The clock chip keeps the time while the console is off, so it only needs setting once; the time zone applies to the launcher right away and to the apps opened afterwards.
- Resize Home: expands HOME to fill the rest of the card, at the next boot (it asks first, then restarts). HOME is backed up to RAM while it's resized, so do it right after flashing, before copying your games.
- Empty trash: deletes for good the games moved to the trash in the launcher.
- Power mode: Balanced (the default) speeds the CPU and GPU up only when a game needs it; Battery saver caps the CPU at 816 MHz and the GPU at 240 MHz, for a longer battery life (heavy PS1 games may slow down); Performance keeps both at full speed. The choice is kept across reboots.
- Restore default settings: puts Overlay, Date & Time, the launcher's view, tabs, font and accent color, and the power mode back to the defaults in
/usr/share/goodluck/defaults, keeping the language, the confirm button, the time zone and the clock. - Confirm button: A (right, the default, as on a Nintendo pad) or B (bottom, as on an Xbox pad) launches and selects, and the other one goes back. The launcher, its hints and the shortcut list change right away. Every app that reads the pad through SDL (the video player, ports, Luanti) gets the chosen button as its south one, the button these apps confirm and jump with, from the next one you open. RetroArch reads the pad on its own, so with B the Game Boy (Color), GBA, NES and SNES cores get A and B swapped in their core remaps (
~/.config/retroarch/config/remaps/<core>/<core>.rmp), and their games confirm with B too. A remap of your own for A or B is left alone, and going back to A takes the swap out. The other systems keep the buttons as printed (Western PlayStation games already confirm with the bottom one), and RetroArch's menu has its own swap option. - Credits: the people who made goodluckOS, grouped by role (someone with several roles shows under each), from the list of upstream's credits app (
/usr/share/credits/credits.ini).
UP / DOWN pick a section and A or RIGHT opens its page; there, LEFT / RIGHT change the selected setting (A opens the list of choices, or turns a switch on or off), B goes back, and L1 / R1 go to the previous / next section from anywhere. START closes System Settings, and POWER opens the power options here too. A change applies and is saved right away, the language and the font included. A page scrolls with the d-pad when it doesn't fit the screen.
VT323 and Pixelify Sans are under the SIL Open Font License and ProggyClean under the MIT License; their license files are next to them in /usr/share/fonts.
| Sections, with Display & Audio | Launcher tabs |
|---|---|
| Overlay | In-game status bar |
| Date & Time | Performance overlay in game (FN + D-pad up) |
| System (Power mode) | Storage: the second card and the trash |
Every text in the launcher, System Settings included, and in the console's messages ("Restarting...") can be translated, and new languages need no code changes. Languages live in /usr/share/goodluck/lang/<code>.lang (in the repository: rootfs/board/my-device/rootfs-overlay/usr/share/goodluck/lang/) and show up in System Settings -> Interface -> Language as soon as the file is there.
To add a language:
- Copy
pt-BR.langto a file named after your language's code, e.g.es.langorfr.lang. - Change the first lines:
languageis the language's own name (Español) andlanguage_enits English name (Spanish). - Translate the right side of each
English text = Translationline. Keep the left side exactly as it is: it's the text that is looked up. Keep%s/%dwhere they are, and\nfor line breaks. - Keep the launcher's bottom-bar words short (Tab, Launch, Search...): the bar is nearly full.
- Optionally add your language's name to the other files (
Spanish = Espanholinpt-BR.lang), so the selector shows it in every language.
Anything left untranslated simply shows in English. Then open a pull request with the new file.
Stock firmware:
- Based on ancient, unsupported forks of thelinux kernel version 3.4.
- Messy file system, hard to customize, even harder to clean.
- Full of broken/incompatible files.
- Come with inefficient, out-of-date emulator cores.
- Software often not compiled with optimal compiler flags.
- Usually uses swap-on-sd card, which will prematurely kill your expensive microSD card.
- Slow boot time
- Bad/no hotkeys
- Can't be flashed to smaller SD cards.
- The MBR (at least on the GA36-MB) is broken by default. You can't add games unless you manually fix it with my guide
GA36-MB consoles (sold as R36S) come with an Allwinner A23 or A33, and goodluckOS builds for one don't boot on the other. The stock menu reports a 64-bit CPU and 1 GB of RAM on both, and the marking on the chip can't be trusted either. On Windows, chip-version reads the microSD card that came with the console and tells which chip it has.
Plug the console into your PC with a USB cable and open goodluckOS -> HOME (Windows: This PC; Linux: your file manager; macOS needs an MTP app such as OpenMTP). Or plug the SD card into your PC and open up the HOME partition. In there you'll find a roms folder with a few subfolders for each system. Add your roms to those.
If the console was connected to a charger when it booted (no PC), restart it before plugging it into a PC to get MTP; the serial console works either way. Games copied while Puppy is open show up after you reopen it.
On a PC's USB the battery charges up to 90% and then rests, so a console left plugged in for days doesn't wear its battery out. It charges again once the cable comes out and goes back in, or at 50% if a game drains it while plugged in. A charger with no PC behind it charges to full.
Already have a scraped collection (e.g. made with Skraper for EmulationStation)? Copy it as it is, gamelist.xml and media folder included: Puppy reads them.
To add custom art to Puppy, add an image file into the icons folder in your rom folder with the same name as the rom file. (eg. if your game is roms/snes/super-mario.smc, your image would be roms/snes/icons/super-mario.png)
Puppy also reads a gamelist.xml in the rom folder (as written by Skraper or EmulationStation): it takes each game's name, description, year/genre/players and image from it. An image in icons still wins over the gamelist's. With the interface in another language, a gamelist.<code>.xml next to it (e.g. gamelist.pt-BR.xml, written by a scraper pass in that language) supplies that language's names, descriptions and genres; images and anything it lacks still come from gamelist.xml. Big images are scaled down once and cached in ~/.cache/puppy/thumbs.
A FAT32 or exFAT card in the second slot shows up in the launcher, in its own External Card tab and in each system's tab. The card is found when the console starts; to swap it with the console on, use System Settings -> Storage: Eject card before taking it out, and Detect card after putting one in. Put the games in a roms folder with the same system folders as HOME (roms/snes, roms/psx, roms/gba...), and covers in each folder's icons. A card with no roms folder gets the folders created the first time it's mounted; existing folders and files are never touched. Music and videos go in media/music and media/videos.
Puppy finds games by folder, not by file type: games loose on the card, or in the wrong system's folder, won't show up or won't start.
You sure can!
To add a new emulator, find an appropriate armhf libretro core .so file (e.g. from the libretro buildbot). Add it to either:
- The
/usr/lib/libretrofolder in thelinuxpartition, or - Anywhere in your HOME partition, e.g. a
coresfolder
Then modify HOME -> apps.puppy with a new [ARCHIVE] entry, pointing the COMMAND to your new libretro core. Take a look at HOME -> apps.puppy for an exmaple.
Copy them into HOME -> media -> music and HOME -> media -> videos. The Music and Videos tabs show up in the launcher once there's something in them. A folder (an album, a series) is one entry that plays whole, with its cover.jpg or folder.jpg as the art; a single file plays along with the rest of its folder. Other art goes in the icons folder, named like the file or folder.
Controls (also in System Settings -> Input Settings -> Shortcuts):
| Button | Action |
|---|---|
| A / START | Pause |
| B | Quit |
| D-pad left / right, left stick left / right | Back / forward 10 s |
| D-pad down / up | Back / forward 1 min |
| L1 / R1 | Previous / next file |
| X | Show the playlist |
| Y | Repeat on / off |
| L2 / R2 | Audio / subtitle track |
| Left stick up / down | Faster / slower: 0.25x, 0.5x, 1x, 1.5x, 2x. The speed stays for the next files of the playlist |
| R3 / L3 (press the stick) | Zoom in / out: 1x, 1.5x, 2x, 3x, 4x |
| Right stick | Move the zoomed picture, up to its edges |
| SELECT | Back to normal speed and zoom |
With the confirm button on B, A and B swap here too.
The A33 decodes video in software: up to 640x480 H.264 plays smoothly, 1080p and H.265 don't. Convert bigger videos on your PC first, e.g. ffmpeg -i in.mp4 -vf scale=640:480:force_original_aspect_ratio=decrease:force_divisible_by=2 -c:v libx264 -tune fastdecode -crf 23 -c:a aac -ac 2 out.mkv. On Windows, macOS or Linux, convert-videos does this for a whole folder, turns portrait videos to fill the screen and saves a frame of each one as its art.
goodluckOS ships with Chocolate Doom and a shareware Doom wad.
goodluckOS will never be distributed with unauthorized copyright-protected materials. If you own the copyright to any games (or know of any permissively-licensed/CC games) that you think might make a good fit, please open an Issue! We would love to include more small, high-quality games with the OS by default.
Some subset of portmaster games could theoretically work, however I want to tamper your expectations a little bit before we all start getting too excited. The Allwinner A23/A33 is a 32-bit SoC. This means that 64-bit software simply cannot run on it. There are a number of popular android ports that exist only as aarch64 (64-bit) distributions. Those will never work. Additionally, even with ZRAM there, the device is still heavily RAM-limited, so unoptimized games (I'm looking at you, Balatro) will struggle to run without patching.
With that said, most of the games people actually care about (Stardew Valley, Half-Life 1, n64 re-comps, Android GameMaker games, OpenMW, OpenRCT2, + more) are 32-bit games, and therefore should theoretically work if anyone cares to create 32-bit ports.
Four ports are in progress here (Luanti still on its own branch, feat/luanti). Apart from Luanti, they need your own copy of the game, so each one is built on a PC from your files: Ports says how, and how each one runs.
| Luanti | Stardew Valley | Ocarina of Time | Majora's Mask |
|---|---|---|---|
| Free, in the system image | The game from Steam | Your ROM | Your ROM |
GoodluckOS uses a novel four-step containerized build system featuring Buildroot. This means the OS can be configured and built extremely easily and portably with no extra dependencies at all besides Docker and Docker Compose (or Podman).
Take a look at BUILD.MD for instructions and guidelines.
goodluckOS has been designed with a few core principles:
- The core OS will ship with at most one tool for any job. Duplicate functionality is duplicate bugs.
- goodluckOS should strive to be as battery-efficient as possible. If a not-strictly-necessary pretty UI feature uses more resources than an uglier alternative, the uglier alternative will be preferred.
- Do not reinvent the wheel. Opt to use existing packages instead of writing them from scratch so long as they don't conflict with the previous principles.
- Anything not usable by most people should be distributed as an installable package instead of being baked into the core OS.
Please keep those in mind if you intend for your work to be merged upstream :)
We're currently in the process of choosing a package-management solution for goodluckOS, so if your application/feature is not approved for merging upstream please feel free to package it up as an installable application and we would be happy to advertise it as an optional feature for goodluckOS.
Contributors should feel free to use any tool at their disposal to write their code. Good code is good code regardless who (or what) wrote it. However, large systems that have not been properly tested, documented, or are not understood by the human contributors will not be accepted until all of these conditions are met. This rule applies to both human written code and LLM-generated code.
This project is licensed under the GNU GENERAL PUBLIC LICENSE VERSION 2.0 see the LICENSE file for details.
WARNING: The GNU General Public License v2 covers this in more detail, but to re-iterate: This software has the potential to permanently damage your hardware. You alone are responsible for all damages, and the ensuing results of said damages that may occur as a result of using, or attempting to use this software.