{"slug": "show-hn-claude-on-a-2007-nokia-6300-java-me-app-tls-1-0-private-ca", "title": "Show HN: Claude on a 2007 Nokia 6300 (Java ME app, TLS 1.0, private CA)", "summary": "Developer Emir Karsiyakali released Claude S40, an unofficial Claude client for Nokia Series 40 phones built in Java ME (CLDC 1.1 / MIDP 2.0), tested on a Nokia 6300 (RM-217, firmware V06.60). The client pairs with a Go server binary or Docker image that speaks TLS 1.0 to the phone using a certificate from a private CA and modern HTTPS to the Claude API, with per-device access tokens, daily request, token and web-search limits, and SQLite chat storage kept for 30 days. The project is an unofficial side project not made, endorsed or supported by Anthropic or Nokia.", "body_md": "**Chat with Claude on a 2007 Nokia.** Claude S40 is an unofficial Claude\nclient for Nokia Series 40 phones (Java ME, CLDC 1.1 / MIDP 2.0), plus the\nsmall Go server it talks to. Type on the keypad, get Claude's answer on a\n240x320 screen: with today's news, weather and exchange rates from web\nsearch, long answers you can page through, and a UI in Turkish or English.\n\n**Video:** [Claude S40 on a Nokia 6300, on X](https://x.com/EmirKarsiyakali/status/2104183718483018026)\n\n**On the phone**\n\n- **Chat** with bubbles, timestamps and a typing indicator that counts the\nseconds. Replies keep their paragraphs and lists (dots, numbers, hanging\nindent).\n- **Web search** for news, weather, rates: Claude searches on the server,\nthe phone's 2007 browser is not involved. Sources are listed under the\nreply.\n- **Reading mode** (key 7): one reply full width, page by page, whole lines\nonly, page number and progress line. It keeps its place when you change\nthe text size (key 9) or load the rest, and keeps the backlight on.\n- **Long replies in parts** : \"0 · Show the rest\" fetches the next part\nfrom the server for free; Claude is not asked again.\n- **Message actions** : select a message with 1/3, press the centre key:\nshorten, explain more simply, translate, ask about it, open it in the\neditor. They only fill in the editor; nothing is sent until you press\nSend.\n- **Earlier chats** from the server, continue any of them;**pin** the ones\nyou want to keep at the top (kept until unpinned),**delete** or**search** all chats (no Turkish letters needed: \"sise\" finds \"şişe\"); optional\noffline copy of the last chat.\n- **Save to phone** : a reply as a .txt file (memory card if there is one),\nreadable later without the network under \"Saved\".\n- **Calendar and to-do** : ask \"add to my calendar: dentist tomorrow at 3\"\nand the reply carries a ready entry; the centre key opens a prefilled\nform, and only your \"Save\" writes it to the phone's own calendar or to-do\nlist. Works from any message too.\n- **Your notes for Claude** (Settings): \"I'm Emir, I live in Istanbul, keep\nit short\" is sent with every message.\n- **Data usage** : requests and approximate kilobytes today and in total.\n- **20 quick prompts** (search the web, weather, translate, reply to a\nmessage, add to my calendar, summarize, fix my writing, ...).\n- **Setup wizard** on first start: language, server address, connection\ntest, pairing with a 6-digit code (no long code to type).\n- **Keypad-first** : every screen works with the keypad; a Shortcuts screen\nlists every key. Retry after an error is one key and never charges twice.\n- **Look and feel** : light and dark theme, three text sizes, start-up\nanimation and jingle, reply chime, vibration and backlight. Texts are\nfitted to the screen and checked from 128x160 to 320x240.\n\n**On the server**\n\n- One Go binary / Docker image that speaks TLS 1.0 to the phone with a certificate from your own private CA, and modern HTTPS to the Claude API.\n- Per-device access tokens through pairing, daily request, token and web-search limits, no automatic retries of paid calls.\n- SQLite for chats (30 days, pinned ones until unpinned), search over them, admin API on localhost only.\n\n| Home | Waiting for Claude | Lists and paragraphs | Reading mode | \n|---|---|---|---|\n| **A calendar entry, selected** | **Message actions** | **Quick prompts** | **Dark theme, large text** | \n\nScreenshots are from the FreeJ2ME emulator in the app's test mode (the\n\"[Test mode]\" replies are fake and cost nothing; the emulator reports no\ncalendar API, so the harness turns the calendar actions on for these\nscreens and never saves); the cover is a drawing.\nStart-up animation: [docs/images/splash.gif](https://github.com/emir/claude-s40/blob/main/docs/images/splash.gif).\n\nUnofficial side project. Not made, endorsed or supported by Anthropic or\nNokia. See [TRADEMARKS.md](https://github.com/emir/claude-s40/blob/main/TRADEMARKS.md).\n\nTested on a **Nokia 6300 (RM-217, firmware V06.60)**. Other Series 40\nphones (CLDC 1.1 / MIDP 2.0, 240x320) may work but are untested.\n\n``` php\nNokia (Java ME app) --HTTPS: TLS 1.0, RSA, no SNI, cert from YOUR private CA--> claude-s40-server --HTTPS--> Claude API\n                                                                                     |\n                                                                              SQLite (Docker volume)\n```\n\nA 2007 phone cannot speak modern HTTPS: the Nokia 6300 offers only TLS 1.0\nwith RSA key exchange, sends no SNI, and its root store stops around 2008.\nPublic clouds (including Cloudflare) refuse that handshake. So the server\nterminates TLS itself with a certificate from a private root CA that you\nput on the phone once. Details and measurements: [docs/ARCHITECTURE.md](https://github.com/emir/claude-s40/blob/main/docs/ARCHITECTURE.md).\n\n| Path | What | \n|---|---|\n| [`app/`](https://github.com/emir/claude-s40/blob/main/app) | The phone app: CLDC 1.1 / MIDP 2.0 MIDlet, ~100 KB JAR, English + Turkish UI (see Features). Reproducible build with 44 package checks. | \n| [`server/`](https://github.com/emir/claude-s40/blob/main/server) | One Go binary / Docker image (~7 MB): phone-facing TLS, chat backend (official `anthropic-sdk-go` ), SQLite, pairing, admin API bound to localhost. | \n| [`docs/`](https://github.com/emir/claude-s40/blob/main/docs) | [SETUP.md](https://github.com/emir/claude-s40/blob/main/docs/SETUP.md) (step by step),[ARCHITECTURE.md](https://github.com/emir/claude-s40/blob/main/docs/ARCHITECTURE.md) (protocol, TLS, design). | \n\n```\ngit clone https://github.com/emir/claude-s40.git\ncd claude-s40\n```\n\nFull guide: **[docs/SETUP.md](https://github.com/emir/claude-s40/blob/main/docs/SETUP.md)**. In short:\n\n1. A Docker host with a public IPv4 and TCP 443 (a $4-6/month VPS is enough).\n2. `server/scripts/pki.sh ca ~/.config/claude-s40/pki` and`server/scripts/pki.sh server ~/.config/claude-s40/pki <server-ip>` .\n3. `server/deploy/push.sh root@<server-ip> --execute` (starts in test mode, no API cost).\n4. `echo GATEWAY_URL=https://<server-ip> > app/app.local.properties && make -C app` ,\nthen install`app/dist/ClaudeS40.jad/.jar` on the phone.\n5. Put the root CA on the phone (`server/deploy/serve-ca.sh` , compare the fingerprint).\n6. On the phone the setup wizard walks through the connection test and\npairing; approve the code with\n`server/deploy/admin.sh root@<server-ip> pair <code>` .\n7. `server/deploy/set-key.sh root@<server-ip>` and`S40_MOCK=0 server/deploy/push.sh root@<server-ip> --execute` to go live.\n\n```\nmake test          # server: go vet + go test -race; app: build + 44 checks + reproducibility\nmake -C app        # phone app only (downloads pinned build tools to app/.deps)\nmake -C server test\n```\n\nRequirements: Go 1.26+, JDK 11+, Python 3 with Pillow, Docker (for deployment), OpenSSL or LibreSSL.\n\n- The Claude API key lives only on your server. The phone gets a per-device, revocable access token through pairing.\n- Chats are stored on your server for 30 days after the last message; pinned chats until you unpin or delete them. The phone keeps the last chat only if you turn on \"Keep last chat on phone\"; replies you save and calendar entries you add stay on the phone. Your notes for Claude are stored on the phone and sent with each message (never logged).\n- The setup (server address, access code, notes) is also kept in a file on the memory card so a new build needs no new pairing; revoke the device if the card leaves your hands, or use Settings > Reset setup. Logs contain no message text.\n- Every message is a Claude API call billed to your key. The server enforces per-device daily request, output-token and web-search limits and never retries a paid call automatically. Web searches are billed per search and their results count as input tokens. Set a spending limit in the Claude Console.\n\nMIT, see [LICENSE](https://github.com/emir/claude-s40/blob/main/LICENSE). Copyright (c) 2026 Emir Karşıyakalı. Build-time tools are downloaded, not bundled\n(ECJ: EPL-2.0, ProGuard: GPL-2.0, MicroEmulator API stubs: LGPL); none of\nthem end up in the phone app. The optional emulator harness\n`app/emu/EmuShot.java` links against FreeJ2ME (GPL-3.0), which is not\nincluded.", "url": "https://wpnews.pro/news/show-hn-claude-on-a-2007-nokia-6300-java-me-app-tls-1-0-private-ca", "canonical_source": "https://github.com/emir/claude-s40", "published_at": "2026-09-27 17:13:40+00:00", "updated_at": "2026-09-27 17:31:38.227895+00:00", "lang": "en", "topics": ["ai-products", "ai-tools", "developer-tools", "large-language-models"], "entities": ["Claude S40", "Emir Karsiyakali", "Nokia 6300", "Nokia Series 40", "Anthropic", "Nokia", "Java ME", "Claude API"], "also_reported_by": [], "alternates": {"html": "https://wpnews.pro/news/show-hn-claude-on-a-2007-nokia-6300-java-me-app-tls-1-0-private-ca", "markdown": "https://wpnews.pro/news/show-hn-claude-on-a-2007-nokia-6300-java-me-app-tls-1-0-private-ca.md", "text": "https://wpnews.pro/news/show-hn-claude-on-a-2007-nokia-6300-java-me-app-tls-1-0-private-ca.txt", "jsonld": "https://wpnews.pro/news/show-hn-claude-on-a-2007-nokia-6300-java-me-app-tls-1-0-private-ca.jsonld"}}