OpenKakao

local-send / ax-read

Send and read real messages without a server session, by driving the KakaoTalk UI directly.

No server contact, no local DB dependency

local-send and ax-read drive the real KakaoTalk macOS app through the Accessibility (AX) API — selecting a chat row, typing into the composer, and reading rendered message bubbles. Neither one talks to Kakao's servers or the local SQLCipher database. This is why they keep working even while server login is broken and the local DB is unreliable on current KakaoTalk builds.

How it works

Both commands find the target chat by its exact display name, the same text shown in KakaoTalk's chat list — not a chat-id. There is no local database to cross-check the target against anymore, so:

  • Matching is exact, not substring — a search for "Alice" will not accidentally match an "Alice & Bob" group chat.
  • If more than one visible chat shares the exact same display name, both commands refuse to guess and return an error.
  • local-send additionally requires the chat to be listed in a config allowlist before it will send for real (see Safety below).

Requirements:

  • KakaoTalk.app installed, running, and already logged in on this Mac
  • Accessibility permission granted to your terminal (System Settings → Privacy & Security → Accessibility)

local-send

openkakao-cli local-send <chat_name> <message> [OPTIONS]
FlagDescription
-y, --yesSkip the confirmation prompt
--dry-runPreview the action without sending
--jsonOutput as JSON (global flag)
# Preview first
openkakao-cli local-send "chat display name" "Hello from CLI!" --dry-run

# Actually send
openkakao-cli local-send "chat display name" "Hello from CLI!" -y

After typing the message and pressing Enter, local-send polls the chat window's own message list (scraped via AX, the same mechanism as ax-read) to confirm the message actually appeared, instead of trusting a fixed sleep.

ax-read

openkakao-cli ax-read <chat_name> [OPTIONS]
FlagDescription
-n, --count <N>Max messages to return (default: 20)
--jsonOutput as JSON (global flag)
openkakao-cli ax-read "chat display name" -n 20
openkakao-cli ax-read "chat display name" --json

Only what's on screen

ax-read returns messages already rendered in the chat window. It does not scroll for you — if you need older history, scroll up in KakaoTalk first, then re-run the command.

Safety

local-send is disabled by default and needs two things enabled in ~/.config/openkakao/config.toml:

[safety]
allow_ax_send = true
allowed_send_chats = ["chat display name you want to allow"]
  • allow_ax_send — the general opt-in, since local-send types text and hits Enter in a real KakaoTalk window on your behalf.
  • allowed_send_chats — an exact-match allowlist. Because there is no chat-id to verify the send target against, this is the only guard against a typo or a display-name collision sending to the wrong chat. A chat not on this list is rejected before anything is typed.

Both checks are skipped for --dry-run, so you can preview against any chat name without touching config.

ax-read has no equivalent gate — it only reads what's already rendered on screen, so there's nothing to protect against beyond the exact-match/ambiguity check both commands share.

When to use this vs local DB vs LOCO

ScenarioRecommended
Send a real message, server login brokenlocal-send
Read what's currently visible in a chat, server login brokenax-read
Full message history, server login workingread (LOCO)
Full message history, server login brokennot currently available — ax-read only sees what's rendered

Next

On this page