# emir/claude-s40 architecture

> Architecture diagram of the GitHub repository emir/claude-s40, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-09-28). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/emir/claude-s40
- Repository: https://github.com/emir/claude-s40

## Overview

Claude S40 is a keypad-first Java ME Claude client for Nokia Series 40 phones, backed by a Go gateway that bridges the phone’s legacy TLS to the Claude API. The main workflow is setup/pairing, composing a request, server-side chat (optionally with web search), then displaying and paging the reply; chat history and device-local actions are separate branches. The README supplies capabilities not visible in the excerpts; those are mapped to exact tree paths without asserting unsampled call wiring.

Main entry points: [`server/main.go`](https://github.com/emir/claude-s40/blob/main/server/main.go) (TLS gateway), [`app/src/io/github/emir/claudes40/Net.java`](https://github.com/emir/claude-s40/blob/main/app/src/io/github/emir/claudes40/Net.java) (Phone networking), [`app/src/io/github/emir/claudes40/ClaudeS40MIDlet.java`](https://github.com/emir/claude-s40/blob/main/app/src/io/github/emir/claudes40/ClaudeS40MIDlet.java) (MIDlet coordinator), [`server/chat.go`](https://github.com/emir/claude-s40/blob/main/server/chat.go) (Chat service)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_phone_ui["Phone interface"]
  node_midlet["MIDlet coordinator"]
  node_chat_session["Chat session<br/>[ChatSession.java]"]
  node_chat_canvas["Chat display<br/>[ChatCanvas.java]"]
  node_net["Phone networking<br/>[Net.java]"]
end

subgraph group_phone_features["Phone features"]
  node_setup_pair["Setup and pairing<br/>[Setup.java]"]
  node_settings["Settings and backup<br/>[Settings.java]"]
  node_conversation_lists["Chat lists<br/>[ChatList.java]"]
  node_saved_replies["Saved replies<br/>[SavedList.java]"]
  node_calendar["Calendar and tasks<br/>[CalendarForm.java]"]
  node_phone_pim["Phone PIM<br/>[Pim.java]"]
end

subgraph group_gateway["Gateway"]
  node_gateway["TLS gateway<br/>[main.go]"]
  node_protocol["Wire protocol<br/>[protocol.go]"]
  node_sanitizer["Input sanitizing<br/>[sanitize.go]"]
end

subgraph group_backend["Chat backend"]
  node_chat_service["Chat service<br/>[chat.go]"]
  node_claude_model["Claude API client<br/>[claude.go]"]
  node_store[("SQLite store<br/>[store.go]")]
end

node_user(("Phone user"))
node_claude_api{{"Claude API"}}
node_sqlite[("SQLite database")]
node_phone_calendar[("Phone calendar")]

node_user -->|"uses"| node_midlet
node_midlet -->|"creates"| node_chat_session
node_midlet -->|"shows"| node_chat_canvas
node_chat_canvas -->|"renders state"| node_chat_session
node_chat_session -->|"sends requests"| node_net
node_setup_pair -->|"tests and pairs"| node_net
node_net -->|"HTTPS requests"| node_gateway
node_gateway -->|"encodes replies"| node_protocol
node_gateway -->|"validates input"| node_sanitizer
node_gateway -->|"dispatches chat"| node_chat_service
node_gateway -->|"dispatches history"| node_store
node_chat_service -->|"requests completion"| node_claude_model
node_claude_model -->|"HTTPS completion"| node_claude_api
node_chat_service -->|"reads and writes chats"| node_store
node_store -->|"persists data"| node_sqlite
node_conversation_lists -->|"loads chats"| node_net
node_saved_replies -->|"offers offline reading"| node_user
node_calendar -->|"commits entry"| node_phone_pim
node_phone_pim -->|"writes event or task"| node_phone_calendar
node_settings -->|"stores preferences"| node_user

click node_midlet "https://github.com/emir/claude-s40/blob/main/app/src/io/github/emir/claudes40/ClaudeS40MIDlet.java"
click node_chat_session "https://github.com/emir/claude-s40/blob/main/app/src/io/github/emir/claudes40/ChatSession.java"
click node_chat_canvas "https://github.com/emir/claude-s40/blob/main/app/src/io/github/emir/claudes40/ChatCanvas.java"
click node_net "https://github.com/emir/claude-s40/blob/main/app/src/io/github/emir/claudes40/Net.java"
click node_setup_pair "https://github.com/emir/claude-s40/blob/main/app/src/io/github/emir/claudes40/Setup.java"
click node_settings "https://github.com/emir/claude-s40/blob/main/app/src/io/github/emir/claudes40/Settings.java"
click node_conversation_lists "https://github.com/emir/claude-s40/blob/main/app/src/io/github/emir/claudes40/ChatList.java"
click node_saved_replies "https://github.com/emir/claude-s40/blob/main/app/src/io/github/emir/claudes40/SavedList.java"
click node_calendar "https://github.com/emir/claude-s40/blob/main/app/src/io/github/emir/claudes40/CalendarForm.java"
click node_phone_pim "https://github.com/emir/claude-s40/blob/main/app/src/io/github/emir/claudes40/Pim.java"
click node_gateway "https://github.com/emir/claude-s40/blob/main/server/main.go"
click node_protocol "https://github.com/emir/claude-s40/blob/main/server/protocol.go"
click node_sanitizer "https://github.com/emir/claude-s40/blob/main/server/sanitize.go"
click node_chat_service "https://github.com/emir/claude-s40/blob/main/server/chat.go"
click node_claude_model "https://github.com/emir/claude-s40/blob/main/server/claude.go"
click node_store "https://github.com/emir/claude-s40/blob/main/server/store.go"

classDef toneNeutral fill:#f8fafc,stroke:#334155,stroke-width:1.5px,color:#0f172a
classDef toneBlue fill:#dbeafe,stroke:#2563eb,stroke-width:1.5px,color:#172554
classDef toneAmber fill:#fef3c7,stroke:#d97706,stroke-width:1.5px,color:#78350f
classDef toneMint fill:#dcfce7,stroke:#16a34a,stroke-width:1.5px,color:#14532d
classDef toneRose fill:#ffe4e6,stroke:#e11d48,stroke-width:1.5px,color:#881337
classDef toneIndigo fill:#e0e7ff,stroke:#4f46e5,stroke-width:1.5px,color:#312e81
classDef toneTeal fill:#ccfbf1,stroke:#0f766e,stroke-width:1.5px,color:#134e4a
class node_midlet,node_chat_session,node_chat_canvas,node_net,node_user toneBlue
class node_setup_pair,node_settings,node_conversation_lists,node_saved_replies,node_calendar,node_phone_pim,node_sqlite,node_phone_calendar toneAmber
class node_gateway,node_protocol,node_sanitizer,node_claude_api toneMint
class node_chat_service,node_claude_model,node_store toneRose
```

## Components

### Phone interface

- [MIDlet coordinator](https://github.com/emir/claude-s40/blob/main/app/src/io/github/emir/claudes40/ClaudeS40MIDlet.java): `app/src/io/github/emir/claudes40/ClaudeS40MIDlet.java`
- [Chat session](https://github.com/emir/claude-s40/blob/main/app/src/io/github/emir/claudes40/ChatSession.java): `app/src/io/github/emir/claudes40/ChatSession.java`
- [Chat display](https://github.com/emir/claude-s40/blob/main/app/src/io/github/emir/claudes40/ChatCanvas.java): `app/src/io/github/emir/claudes40/ChatCanvas.java`
- [Phone networking](https://github.com/emir/claude-s40/blob/main/app/src/io/github/emir/claudes40/Net.java): `app/src/io/github/emir/claudes40/Net.java`

### Phone features

- [Setup and pairing](https://github.com/emir/claude-s40/blob/main/app/src/io/github/emir/claudes40/Setup.java): `app/src/io/github/emir/claudes40/Setup.java`
- [Settings and backup](https://github.com/emir/claude-s40/blob/main/app/src/io/github/emir/claudes40/Settings.java): `app/src/io/github/emir/claudes40/Settings.java`
- [Chat lists](https://github.com/emir/claude-s40/blob/main/app/src/io/github/emir/claudes40/ChatList.java): `app/src/io/github/emir/claudes40/ChatList.java`
- [Saved replies](https://github.com/emir/claude-s40/blob/main/app/src/io/github/emir/claudes40/SavedList.java): `app/src/io/github/emir/claudes40/SavedList.java`
- [Calendar and tasks](https://github.com/emir/claude-s40/blob/main/app/src/io/github/emir/claudes40/CalendarForm.java): `app/src/io/github/emir/claudes40/CalendarForm.java`
- [Phone PIM](https://github.com/emir/claude-s40/blob/main/app/src/io/github/emir/claudes40/Pim.java): `app/src/io/github/emir/claudes40/Pim.java`

### Gateway

- [TLS gateway](https://github.com/emir/claude-s40/blob/main/server/main.go): `server/main.go`
- [Wire protocol](https://github.com/emir/claude-s40/blob/main/server/protocol.go): `server/protocol.go`
- [Input sanitizing](https://github.com/emir/claude-s40/blob/main/server/sanitize.go): `server/sanitize.go`

### Chat backend

- [Chat service](https://github.com/emir/claude-s40/blob/main/server/chat.go): `server/chat.go`
- [Claude API client](https://github.com/emir/claude-s40/blob/main/server/claude.go): `server/claude.go`
- [SQLite store](https://github.com/emir/claude-s40/blob/main/server/store.go): `server/store.go`

### Other components

- **Phone user**
- **Claude API**
- **SQLite database**
- **Phone calendar**

## Connections

- Phone user → MIDlet coordinator: uses
- MIDlet coordinator → Chat session: creates
- MIDlet coordinator → Chat display: shows
- Chat display → Chat session: renders state
- Chat session → Phone networking: sends requests
- Setup and pairing → Phone networking: tests and pairs
- Phone networking → TLS gateway: HTTPS requests
- TLS gateway → Wire protocol: encodes replies
- TLS gateway → Input sanitizing: validates input
- TLS gateway → Chat service: dispatches chat
- TLS gateway → SQLite store: dispatches history
- Chat service → Claude API client: requests completion
- Claude API client → Claude API: HTTPS completion
- Chat service → SQLite store: reads and writes chats
- SQLite store → SQLite database: persists data
- Chat lists → Phone networking: loads chats
- Saved replies → Phone user: offers offline reading
- Calendar and tasks → Phone PIM: commits entry
- Phone PIM → Phone calendar: writes event or task
- Settings and backup → Phone user: stores preferences
