Skip to content

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

22 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

switch-dit

switch-dit

A native Reddit client for the Nintendo Switch.

Because somewhere between Mario Kart races, you deserve to know what strangers on the internet are angry about today.

Latest release Platform Built with


Yes, this is real: a homebrew NRO (C · libnx · SDL2) that turns the world's premier Mario machine into the world's most ergonomic doomscrolling device. The UI copies the official Reddit Android app's dark theme — card feed with thumbnails, fullscreen image viewer with zoom, video/GIF playback via ffmpeg, touch + controller support, and search through the on-screen keyboard.

Browse signed out (public RSS feeds), or sign in to your own account and get the full experience: scores, comments, your home feed, profiles, voting, saving, and posting comments with a Joy-Con. Your typos, now in 720p.

Warning

The boring-but-important part: running homebrew requires a console with CFW (Atmosphère) and carries a real risk of a Nintendo ban. Tools like 90DNS/Incognito reduce the risk but do not eliminate it. Nintendo does not share your enthusiasm for this project.

Features

  • Card feed with thumbnails, images, GIFs, and Reddit-hosted video — the full balanced breakfast
  • Optional account login (OAuth) — scores, comments, home feed, profiles, vote/save/comment
  • QR + phone-helper login — nothing to type on the console, because typing a 30-character OAuth code with a joystick is a war crime
  • Fullscreen image viewer with zoom & pan; ffmpeg player with seeking (hardware-decoded, the Tegra finally doing what it was born for)
  • TLS certificate verification with a bundled CA — yes, a homebrew app that actually checks certificates. We're as surprised as you are.
  • Full controller + touch support. Upvote with L, downvote with R, question your life choices with either.

Quick start

  1. Grab the latest release and unzip switch-dit-v*.zip onto your SD card (it drops a switch/ folder in place).
  2. Start a companion server: node server.js.
  3. Tell the app where it lives, in sd:/switch/switch-dit/config.ini:
    server=http://192.168.1.11:8080
    
  4. Launch switch-reddit from the Homebrew Menu. Congratulations, r/all is now a handheld experience.

That's the signed-out setup. For the deluxe tour, see Signing in below.

Why there is a companion server

Short version: Reddit doesn't want to talk to your Switch, so we hired an interpreter.

Long version: Reddit shut down unauthenticated .json access in May 2026, and its edge blocks unfamiliar TLS fingerprints on sight — and a game console speaking mbedTLS is about as familiar to it as a fax machine. The companion server is an ordinary Node process that Reddit has no beef with. Depending on mode it:

  • reads Reddit's public RSS feeds (signed out), politely: one request every 6 s, 20-minute cache, exponential backoff on 429 — basically the world's most patient feed reader;
  • proxies the OAuth token exchange and official API when signed in, since Reddit 403s the console's TLS handshake but happily serves the exact same request from Node;
  • proxies images and video (HLS) so the console never has to introduce itself to Reddit directly;
  • serves a small phone login helper page, sparing you the joystick-keyboard.

Two ways to run it:

  • On your home network (a spare PC or a Raspberry Pi). Best for signed-out use — home IPs can fetch public RSS. Address looks like http://192.168.1.11:8080.
  • On a cheap/free cloud VM behind HTTPS (this repo's lives at https://dit.menaworks.xyz, Caddy + Let's Encrypt). Best signed-in: works from anywhere, no PC humming in the corner. Datacenter IPs can't fetch anonymous RSS, but once you're logged in nobody misses it.

Running the server

One file, zero dependencies, Node 18+. The package.json industrial complex weeps:

node server.js

It prints the LAN address to use — put that in sd:/switch/switch-dit/config.ini as shown in Quick start.

For development you can skip the config file and yeet the address over the network:

docker run --rm -v "$PWD/homebrew:/app" devkitpro/devkita64:latest \
  nxlink -s -a <switch-ip> /app/switch-reddit.nro server=http://192.168.1.11:8080

Signing in to your Reddit account (optional)

Uses OAuth's authorization-code flow: your password never touches this app, and 2FA works because you log in on Reddit's own page like a civilized person.

1. Get a client id. Create an installed app at https://www.reddit.com/prefs/apps with redirect URI http://localhost:8080, and put the id in config.ini:

client_id=YOUR_APP_ID

Reddit often denies new app requests these days (they're going through something). If so, you can reuse an open-source client's id (e.g. RedReader) — then its redirect URI and user agent must match exactly:

client_id=REDREADER_APP_ID
redirect_uri=redreader://rr_oauth_redir
user_agent=org.quantumbadger.redreader/1.25.2

2. Sign in on the Switch. Press in the feed. A QR code appears — scan it with your phone, tap Allow on Reddit, paste the resulting redreader://…?code=… address back into the helper page, and walk away. The Switch polls the server, finishes the login by itself, and greets you by name. Total characters typed on the console: zero.

The session persists (refresh token on the SD card) and auto-refreshes. Log in once, doomscroll forever.

No companion server? The account screen falls back to showing the auth URL and letting you type the code in manually. It builds character.

Security

For a console app whose main job is showing you cat pictures, this got surprisingly serious:

  • Keep the bundled cacert.pem at sd:/switch/switch-dit/cacert.pem and the client verifies TLS certificates. Without it, traffic is still encrypted but the server's identity is taken on faith — like meeting someone from Craigslist.
  • Use an https:// server address so tokens never travel in plaintext. The cloud deployment terminates TLS with Caddy/Let's Encrypt, exposes only 22/80/443, rate-limits the public relay, and keeps the app port internal.
  • Secrets (config.ini, token.txt) are gitignored and never committed. Your refresh token's business is its own.

Controls

Feed

Button Action
Left stick / D-pad Navigate / scroll
A Open post
B Back / up one level
X Cycle sort (Hot → New → Top)
Y Search posts
ZR Save the selected post's subreddit locally
ZL Local saved subreddits
L / R Home / Popular
Account screen (login, profile, sign out)
+ Exit (there is no algorithm keeping you here — this is a feature)
Touch Cards, bottom tabs

In a post (signing in unlocks the responsibility buttons)

Button Action
A Fullscreen image
Y Play video/GIF
X Open in the Switch browser
L / R Upvote / downvote
ZL Save / unsave on Reddit
ZR Open the author's profile
Write a comment (with the on-screen keyboard; keep it short, hero)
B Back

Building from source

docker run --rm -v "$PWD/homebrew:/app" -w /app devkitpro/devkita64:latest make

Output: homebrew/switch-reddit.nro. If the link order of freetype and harfbuzz ever changes, light a candle.

Layout

  • server.js — RSS reader + JSON API, OAuth/token & official-API proxy, image/video proxy, phone login helper, disk-backed cache, rate limiting. One file. It's had a life.
  • public/ — optional browser UI for the same server (works in the Switch browser)
  • homebrew/source/main.c — UI, navigation, feeds, account screens, image viewer
  • homebrew/source/net.c — sockets, HTTP(S), OAuth flow, config, TLS, rate limiting
  • homebrew/source/reddit.c — feed/comment/account parsing (RSS, server, official API)
  • homebrew/source/rss.c — standalone Atom parser (used when no server is set)
  • homebrew/source/player.c — ffmpeg video/GIF player
  • homebrew/source/qrcodegen.* — QR generator for login (Nayuki, MIT)
  • homebrew/cacert.pem — Mozilla CA bundle, because trust is earned

About

Personal Reddit client for Nintendo Switch — native homebrew app (libnx/SDL2) using the official OAuth2 API

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages