u/International_Hawk30

i built a browser TTS app for my korean and japanese reading practice — no api key, all local

i built a browser TTS app for my korean and japanese reading practice — no api key, all local

i started reading korean and japanese articles during morning walks and wanted something to read them aloud. tried a few TTS sites — most wanted an account, some wanted a credit card, and all of them shipped my text to a server somewhere. felt silly for a use case that's basically "play this paragraph out loud."

so i made a single-page web app that runs the whole thing in the browser. you paste text (or drop a .txt / .docx), pick a voice, hit speak. nothing leaves the page. it uses supertonic 3 as the model — small enough to run on a phone GPU via WebGPU, falls back to WebAssembly when WebGPU isn't there.

what's in it:

  • 3 UI languages — english, korean, japanese — with preset sample text for each
  • 6 voices, all usable with any of the 32 supertonic language tags
  • output is a 44.1kHz mono WAV you can download
  • first load streams ~380MB of ONNX weights from hugging face's CDN, then caches in the browser

honest limits: it's a thin app on top of supertone's open-source model. no fine-tuning, no voice cloning, no real-time streaming — you press play, it generates, then it plays. WebGPU works great in chrome/edge; on firefox/safari it falls back to WASM and longer paragraphs get slow. and the first load is genuinely a coffee-break (~380MB) — i couldn't see a way around that without giving up the "fully local" property.

repo: https://github.com/cskwork/supertonic-tts

if you read in a language that isn't english/korean/japanese, adding a UI tab is one entry in LANGS in app/main.js — happy to take a PR.

posted via my own reddit mcp — https://github.com/cskwork/reddit-mcp

u/International_Hawk30 — 6 days ago
▲ 12 r/rust

stumbled on this and thought it deserved more visibility — RHWP is a viewer/editor for HWP and HWPX, the Korean word-processor format from Hancom that ~50M people use daily but historically has had no real OSS reader (think "the Microsoft Word of Korea" with a strong proprietary lock-in).

built in pure Rust with a WASM compile target. same parser runs:

  • in the browser (online demo: https://edwardkim.github.io/rhwp/)
  • as VS Code / Chrome / Firefox / Safari / Edge extensions
  • as npm packages (@rhwp/editor full UI, @rhwp/core API)
  • as a native Rust crate (cargo build, Rust 1.75+)

HWP/HWPX is genuinely nasty to parse — proprietary binary container, encrypted streams, embedded compound documents — so the format reverse engineering is the bulk of the work. currently 1,100+ tests covering edge cases, v0.7.9 just shipped (Apr 30), and the maintainer is merging external contributor PRs.

the methodology side caught my eye too: the author keeps detailed AI-pair-programming notes in mydocs/ (2,200+ files documenting design decisions, prompts, and how Claude Code was used as an implementation partner while the human kept architecture ownership). worth a read whether or not you care about HWP.

repo: https://github.com/edwardkim/rhwp (MIT)

not my project — just a fan sharing because rust+wasm for proprietary-format parsing feels like a niche that deserves more attention here.

(disclosure: posted via my own reddit MCP — https://github.com/cskwork/reddit-mcp)

reddit.com
u/International_Hawk30 — 20 days ago
▲ 2 r/mcp

I spent an hour trying to post a project on r/ClaudeAI through the popular Reddit MCP server and kept hitting the same wall — Reddit's API rejected every submission with SUBMIT_VALIDATION_FLAIR_REQUIRED and the MCP didn't expose a flair parameter at all. Checked a couple of alternatives. One takes a flair arg but passes it straight to PRAW, where Reddit actually expects a flair_id, so the flair silently drops and the post fails the same way.

So I built a small one that does the lookup correctly.

The flair fix. Pass flair_text="Showcase". The server fetches subreddit.flair.link_templates, matches by display text (case-insensitive — exact first, then unique substring), and submits with the resolved flair_id. On miss, the error returns the full list of valid flairs so you know exactly what to retry with.

What's exposed over MCP:

  • create_post, edit_post, delete_post
  • list_flairs, get_post, search_reddit

There's also a standalone CLI (reddit-post post|edit|delete|flairs|get) for one-off use without the MCP transport, plus a bundled Claude Code skill that encodes a four-step flow: discover flairs → study the top 5 recent posts on the topic in the target sub → draft → dry-run → post with explicit user approval. The "study top 5" step is what keeps the LLM from shipping landing-page copy into a sub that rewards anecdote.

Credentials read from env vars first, then ~/.claude.json mcpServers.reddit.env as fallback, so it slots into existing configs without re-entering secrets.

Repo (MIT, Python + PRAW + FastMCP): https://github.com/cskwork/reddit-mcp

Happy to take feedback or PRs — especially if your sub uses flair conventions I haven't tested against yet.

(Disclosure: this post was made using the MCP itself, which felt like the appropriate dogfood test.)

u/International_Hawk30 — 20 days ago