Back to projects

In team use · improving

BerryTicket

A team task system that picks up work scattered across Discord conversations, turns it into tasks, and lets people check them through a bot.

A system that picks up team work from Discord conversations with AI and shows it through a Discord bot. With the team's agreement, I built it alone using generative AI; in the first 10 days of operation (October 16–25, 2026), about 94% of task-change records were handled automatically. The Betty Mac app is being prepared for release, and I keep improving the system in use.

ResultAbout 94% of task changes recorded automatically · 91% of day-to-day new tasks created from conversation

Period
2026.10 - Present
Ownership
Built solo with generative AI · server · AI extraction · Mac app · Discord bot
Team
Solo build with generative AI · used by a 17-person team (13 registered)
Repository
Private repository

Work was getting lost in conversation

At Blueberry Team, requests and progress updates come up in Discord conversations. Those messages scroll away quickly, so it was hard to see who was working on what. There was no system for managing work; people picked up whatever was open at the moment, and many members ended up taking breaks (my own recollection). The clearer each person's role, the more of a burden it is for someone to keep task management going.

I took that on. With the team's agreement, I built the BerryTicket server, which uses AI to read conversations, create tasks, and record progress and completion, along with a Discord bot, building it alone with generative AI. Of the 17-person team (including members on break), the 13 registered members use it. The Betty Mac app is being prepared for release to the team. It has been about one week in operation, and I am improving it as we use it.

In the first 10 days of operation (October 16–25, 2026), about 94% of 1,469 task-change records (1,386) were recorded automatically from conversations and GitHub and Figma matching; people changed tasks by hand 83 times. Excluding the first-day cleanup of past conversations, 160 of the 175 tasks that came up in day-to-day work (91%) were created automatically from conversation. Of 723 automatic links and progress or completion updates, none were undone by a person. 9 of the 13 registered members have talked to the Discord bot.

Turning conversation into tasks, with no task left unowned

Requests and progress appear in conversation, but they scroll away and cannot be listed later.

Asking members to enter work into another tool would not last. Yet an in-progress task with no owner simply stalls.

Codex reads the conversation, creates tasks, and records progress and completion. When automation moves an unowned task to in progress or done, it assigns the author of the supporting messages if exactly one registered member wrote them; on GitHub it uses the pull request author or the single assignee of an issue. With several authors, an unknown account, or an existing owner, it leaves the task unassigned, and undoing the automation also undoes the assignment.

Before the change (October 24, 2026), 45 of 70 in-progress tasks had no owner. It went live the same day and its effect is still being measured; past tasks were not changed retroactively.

Implementation details
  • Create tasks from Discord conversations with AI.
  • Apply progress and completion messages to existing tasks.
  • Assign an owner only when the evidence is clear; otherwise leave it empty.

In automation that decides for people, defining when not to decide matters more than defining when to decide.

Answer right away when asked

Every “what are my tasks?” request called an AI model, so a reply took about 30 seconds.

The task list was already in the database; the answer only needed formatting. If the wait is long, searching by hand becomes faster than asking the bot.

Task lookups no longer call a model; tasks from the database are returned through a template. A button in the reply marks a task complete on the spot.

Before: in 72 hours of logs from October 21–24, 2026, the 16–17 conversations answered by the model had a median of 8.0 seconds of setup plus 23.2 seconds of generation (generation p90: 50.5 seconds). After: in one measurement on October 24, the bot replied 1.2–1.4 seconds after receiving the message (single measurement). Other conversations are still answered by the model and take around 30 seconds.

Implementation details
  • Removed model calls from task lookups.
  • Return a member's tasks through a template.
  • Complete tasks from a button in the reply.

Even in an AI feature, if the answer is already in the data, skipping the model is faster and more reliable.

Calling the AI less, and with less

Calling the AI for every message makes cost and latency grow with conversation volume.

Cutting too much would miss tasks. Calls and prompt size had to shrink without hurting extraction.

For matching against existing tasks, I now send only the fields the model actually reads and verify against the original data separately. Real-time extraction used to run whenever a conversation paused for 30 seconds; now it batches after a two-minute pause (up to 10 minutes), and messages that are only laughter or emoji do not trigger it.

After the October 22, 2026 change, input tokens per hourly Discord matching run fell from an average of 202,472 to 104,074, about 49% (average of four runs before and after). For real-time extraction, replaying the previous 24 hours of real messages (1,854) with only the rule changed gave 229 calls before and 103 after, 55% fewer (the actual log had 231 calls). The trade-off is an average wait of about 4.9 minutes before extraction.

Implementation details
  • Send only the fields the model reads; verify against the original data.
  • Batch extraction after a two-minute pause (up to 10 minutes).
  • Skip messages that are only laughter or emoji.

AI cost and speed depend more on when and what you send than on which model you pick, and every cut needs its trade-off with waiting time checked in numbers.

Bringing work tools and tasks together

Tasks were tied to GitHub pull requests, issues, and Figma changes, but each lived somewhere else.

If checking the board means opening a browser, it does not become a daily habit.

GitHub issues and pull requests sync read-only on a schedule. Task numbers, Discord links, and closes references in the text link them first; for the rest, AI compares scope and either links them or asks for confirmation. Figma files and comments are fetched on a schedule and compared with the previous snapshot, and changed screens or new requests are matched against existing tasks. I am also building the Betty Mac app with Go, Wails v3, and Svelte 5 and preparing it for release to the team. Sign-in uses Discord OAuth.

9 of 13 registered members talked to the Discord bot (October 16–24). None of 723 automatic links and progress or completion updates were undone by a person. The Mac app has not been released to the team yet.

Implementation details
  • Link GitHub by task number, links, and closes references; AI compares the rest.
  • Match Figma snapshot differences against tasks.
  • A Mac app with My Tasks, a team board, checklists, trash, and a cleanup mode.

Bringing tasks to tools people already use works better than adding another tool.

How a task moves

Create tasks from conversation and show the same tasks everywhere

  1. 01

    Discord conversation

    Requests, progress, completion

  2. 02

    BerryTicket server

    Node.js · SQLite · Docker Compose

  3. 03

    AI extraction

    Codex creates and updates tasks

  4. 04

    Tool links

    GitHub · Figma (scheduled sync)

  5. 05

    Where people see it

    Discord bot · Betty Mac app (release in preparation)

The 13 registered members of the 17-person team use it (about one week in operation). Figures come from the production database and logs. The repositories are private, and screenshots use demo data.

I now separate what should be left to AI from what the data already decides.

Not yet verified

It has only just gone into use and is still being improved throughout. The post-change lookup time is a single measurement, the drop in extraction calls is a replay estimate on real messages, and the effect of automatic assignment is still being measured. The automation share counts task-change records, and one change can leave several records. The Mac app has not been released to the team. Extraction accuracy, missed tasks, and changes in how the team works have not been measured yet.

Next to verify

  • Measure extraction accuracy and missed tasks
  • Improve Betty's screens and flows from user feedback
  • Check whether work actually moves faster