A 2007 Nokia can't search Google anymore, so I gave it Claude. Unofficial J2ME app + tiny Go server.
Java
39
12 commits
updated Sep 27, 2026

Chat with Claude on a 2007 Nokia. Claude S40 is an unofficial Claude client for Nokia Series 40 phones (Java ME, CLDC 1.1 / MIDP 2.0), plus the small Go server it talks to. Type on the keypad, get Claude's answer on a 240x320 screen: with today's news, weather and exchange rates from web search, long answers you can page through, and a UI in Turkish or English.
Video: Claude S40 on a Nokia 6300, on X
On the phone
On the server
| Home | Waiting for Claude | Lists and paragraphs | Reading mode |
|---|---|---|---|
![]() | ![]() | ![]() | ![]() |
| A calendar entry, selected | Message actions | Quick prompts | Dark theme, large text |
![]() | ![]() | ![]() | ![]() |
Screenshots are from the FreeJ2ME emulator in the app's test mode (the "[Test mode]" replies are fake and cost nothing; the emulator reports no calendar API, so the harness turns the calendar actions on for these screens and never saves); the cover is a drawing. Start-up animation: docs/images/splash.gif.
Unofficial side project. Not made, endorsed or supported by Anthropic or Nokia. See TRADEMARKS.md.
Tested on a Nokia 6300 (RM-217, firmware V06.60). Other Series 40 phones (CLDC 1.1 / MIDP 2.0, 240x320) may work but are untested.
Nokia (Java ME app) --HTTPS: TLS 1.0, RSA, no SNI, cert from YOUR private CA--> claude-s40-server --HTTPS--> Claude API
|
SQLite (Docker volume)
A 2007 phone cannot speak modern HTTPS: the Nokia 6300 offers only TLS 1.0 with RSA key exchange, sends no SNI, and its root store stops around 2008. Public clouds (including Cloudflare) refuse that handshake. So the server terminates TLS itself with a certificate from a private root CA that you put on the phone once. Details and measurements: docs/ARCHITECTURE.md.
| Path | What |
|---|---|
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. |
server/ | One Go binary / Docker image (~7 MB): phone-facing TLS, chat backend (official anthropic-sdk-go), SQLite, pairing, admin API bound to localhost. |
docs/ | SETUP.md (step by step), ARCHITECTURE.md (protocol, TLS, design). |
git clone https://github.com/emir/claude-s40.git
cd claude-s40
Full guide: docs/SETUP.md. In short:
server/scripts/pki.sh ca ~/.config/claude-s40/pki and
server/scripts/pki.sh server ~/.config/claude-s40/pki <server-ip>.server/deploy/push.sh root@<server-ip> --execute (starts in test mode, no API cost).echo GATEWAY_URL=https://<server-ip> > app/app.local.properties && make -C app,
then install app/dist/ClaudeS40.jad/.jar on the phone.server/deploy/serve-ca.sh, compare the fingerprint).server/deploy/admin.sh root@<server-ip> pair <code>.server/deploy/set-key.sh root@<server-ip> and
S40_MOCK=0 server/deploy/push.sh root@<server-ip> --execute to go live.make test # server: go vet + go test -race; app: build + 44 checks + reproducibility
make -C app # phone app only (downloads pinned build tools to app/.deps)
make -C server test
Requirements: Go 1.26+, JDK 11+, Python 3 with Pillow, Docker (for deployment), OpenSSL or LibreSSL.
MIT, see LICENSE. Copyright (c) 2026 Emir Karşıyakalı. Build-time tools are downloaded, not bundled
(ECJ: EPL-2.0, ProGuard: GPL-2.0, MicroEmulator API stubs: LGPL); none of
them end up in the phone app. The optional emulator harness
app/emu/EmuShot.java links against FreeJ2ME (GPL-3.0), which is not
included.
12 commits
Java
62.8%
Go
23.3%
Python
8.1%
Shell
4.6%
A 2007 Nokia can't search Google anymore, so I gave it Claude. Unofficial J2ME app + tiny Go server.
Java
39
12 commits
updated Sep 27, 2026

Chat with Claude on a 2007 Nokia. Claude S40 is an unofficial Claude client for Nokia Series 40 phones (Java ME, CLDC 1.1 / MIDP 2.0), plus the small Go server it talks to. Type on the keypad, get Claude's answer on a 240x320 screen: with today's news, weather and exchange rates from web search, long answers you can page through, and a UI in Turkish or English.
Video: Claude S40 on a Nokia 6300, on X
On the phone
On the server
| Home | Waiting for Claude | Lists and paragraphs | Reading mode |
|---|---|---|---|
![]() | ![]() | ![]() | ![]() |
| A calendar entry, selected | Message actions | Quick prompts | Dark theme, large text |
![]() | ![]() | ![]() | ![]() |
Screenshots are from the FreeJ2ME emulator in the app's test mode (the "[Test mode]" replies are fake and cost nothing; the emulator reports no calendar API, so the harness turns the calendar actions on for these screens and never saves); the cover is a drawing. Start-up animation: docs/images/splash.gif.
Unofficial side project. Not made, endorsed or supported by Anthropic or Nokia. See TRADEMARKS.md.
Tested on a Nokia 6300 (RM-217, firmware V06.60). Other Series 40 phones (CLDC 1.1 / MIDP 2.0, 240x320) may work but are untested.
Nokia (Java ME app) --HTTPS: TLS 1.0, RSA, no SNI, cert from YOUR private CA--> claude-s40-server --HTTPS--> Claude API
|
SQLite (Docker volume)
A 2007 phone cannot speak modern HTTPS: the Nokia 6300 offers only TLS 1.0 with RSA key exchange, sends no SNI, and its root store stops around 2008. Public clouds (including Cloudflare) refuse that handshake. So the server terminates TLS itself with a certificate from a private root CA that you put on the phone once. Details and measurements: docs/ARCHITECTURE.md.
| Path | What |
|---|---|
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. |
server/ | One Go binary / Docker image (~7 MB): phone-facing TLS, chat backend (official anthropic-sdk-go), SQLite, pairing, admin API bound to localhost. |
docs/ | SETUP.md (step by step), ARCHITECTURE.md (protocol, TLS, design). |
git clone https://github.com/emir/claude-s40.git
cd claude-s40
Full guide: docs/SETUP.md. In short:
server/scripts/pki.sh ca ~/.config/claude-s40/pki and
server/scripts/pki.sh server ~/.config/claude-s40/pki <server-ip>.server/deploy/push.sh root@<server-ip> --execute (starts in test mode, no API cost).echo GATEWAY_URL=https://<server-ip> > app/app.local.properties && make -C app,
then install app/dist/ClaudeS40.jad/.jar on the phone.server/deploy/serve-ca.sh, compare the fingerprint).server/deploy/admin.sh root@<server-ip> pair <code>.server/deploy/set-key.sh root@<server-ip> and
S40_MOCK=0 server/deploy/push.sh root@<server-ip> --execute to go live.make test # server: go vet + go test -race; app: build + 44 checks + reproducibility
make -C app # phone app only (downloads pinned build tools to app/.deps)
make -C server test
Requirements: Go 1.26+, JDK 11+, Python 3 with Pillow, Docker (for deployment), OpenSSL or LibreSSL.
MIT, see LICENSE. Copyright (c) 2026 Emir Karşıyakalı. Build-time tools are downloaded, not bundled
(ECJ: EPL-2.0, ProGuard: GPL-2.0, MicroEmulator API stubs: LGPL); none of
them end up in the phone app. The optional emulator harness
app/emu/EmuShot.java links against FreeJ2ME (GPL-3.0), which is not
included.
12 commits
Java
62.8%
Go
23.3%
Python
8.1%
Shell
4.6%