This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
chattolib is an async Python client library for the Chatto webchat GraphQL API (https://chat.chatto.run/api/graphql). It wraps the full Chatto GraphQL schema — queries, mutations, and subscriptions — into a typed, Pythonic async interface.
# Install in development mode
pip install -e ".[dev]"
# Run all tests
pytest
# Run a single test
pytest tests/test_foo.py::test_bar -v
# Lint & format
ruff check .
ruff format .
# Type checking
mypy src/chattolib
The library uses httpx for async HTTP and websockets for GraphQL subscriptions (real-time events via WebSocket).
src/chattolib/ChattoClient async class. Holds the httpx session, auth token, and base URL. All API methods live here or are mixed in from domain modules.| Domain | Queries | Mutations | Subscriptions |
|---|---|---|---|
| Server | server |
updateServer, logo/banner uploads |
myEvents |
| Rooms | room, room.events, room.event, room.eventsAround |
createRoom, updateRoom, archiveRoom, joinRoom, leaveRoom, markRoomAsRead |
myEvents |
| Messages | (via room.events) | postMessage, editMessage, deleteMessage |
MessagePostedEvent, MessageUpdatedEvent, MessageDeletedEvent |
| Reactions | (on message events) | addReaction, removeReaction |
ReactionAddedEvent, ReactionRemovedEvent |
| Threads | room.event.threadReplies, viewer.followedThreads |
followThread, unfollowThread, markThreadAsRead |
ThreadFollowChangedEvent |
| Users | viewer.user, user(id), userByLogin, users |
updateProfile, uploadAvatar, deleteAvatar |
UserProfileUpdatedEvent, PresenceChangedEvent |
| DMs | (via rooms) | startDM |
NewDirectMessageNotificationEvent |
| Notifications | viewer.notifications, viewer.hasNotifications |
dismissNotification, dismissAllNotifications |
NotificationCreatedEvent, NotificationDismissedEvent |
| Permissions/Roles | via admin query, server.roles |
grantPermission, createRole, assignRole |
— |
| Voice calls | room.voiceCallToken, activeCallRoomIds, room.callParticipants |
— | CallParticipantJoinedEvent, CallParticipantLeftEvent |
| Admin | admin.systemInfo, admin.serverConfig, admin.roles |
admin.updateServerConfig, admin.resetServerConfig |
via myEvents |
ID scalar).Int64 scalar (e.g., byte counts) — map to Python int.Upload scalar (multipart form).limit/before/after on room events (before/after are Time scalars, ISO timestamps).input argument with a corresponding *Input type.myEvents for all server, room, and instance events.type field: CHANNEL or DM.width, height, fit (enum: CONTAIN, COVER, EXACT) for server-side resizing.snake_case (translated from GraphQL camelCase)PascalCase matching the GraphQL type namesverb_noun style (e.g., create_room, post_message, mark_room_as_read)