Local-first Slack task triage

A local-first Slack triage tool that combines readable scoring rules with a personal ignore list that learns from my corrections.

ClientDaria's Desk

RoleIdea · Product · Development

TimeframeBuilt in evenings · presented 17 Jun 2026

TeamIndependent product, pair-built with a coding agent

Main stagelive demo at AI Tinkerers Berlin, June 2026

Featured demoselected from hundreds of demos worldwide

See the working product, not a prototype.

46-second walkthrough · 2× speed

From Slack sync to connected tasks, notes, views, and a readable local workflow.

The real requests kept disappearing inside Slack.

My work arrived through direct messages, where real asks disappeared among greetings, notifications, and conversation. I needed one reliable place to capture every request without sending private messages to another cloud service.

One owner across the full cycle.

The case is valuable because the work stayed connected from the first design decision through implementation and iteration.

(a.)

Identified the workflow problem and defined what should count as an actionable request.

(b.)

Designed the board, cards, connections, due dates, themes, and completion feedback.

(c.)

Built the application with Python, Flask, SQLite, and the Slack Web API.

(d.)

Developed a small scoring classifier and a feedback-driven ignore system instead of calling an LLM.

(e.)

Kept processing local, stored the Slack token in Keychain, and presented the working product publicly.

Capture. Classify. Learn. Keep local.

The chapters follow the product from noisy Slack messages through deterministic classification, local organization, and public proof.

Pull work requests out of the inbox before they disappear.

A read-only Slack sync brings potential requests into one local workflow. The access token stays in macOS Keychain, and launchd can run the sync automatically each morning. The tool meets work where it already arrives instead of asking people to adopt another intake process.

  • Read-only Slack Web API
  • Token in Keychain
  • Automatic morning sync
Daria's Desk board with newly synced tasks glowing
Fresh requests glow until they are reviewed

Score request signals with rules anyone can inspect.

A roughly two-hundred-line Python classifier scores each message. Request phrases, deadlines, work terms, questions, and pins add points; greetings and compliments subtract points or are discarded. A message becomes a task only when it clears the threshold and contains a real ask signal.

  • Readable scoring rules
  • ~200 lines of Python
  • No LLM classification
classifier.pyView source ↗
( Input message )
“Can you tighten the deck cover by EOD?”

Question mark+2

Ask phrase · can you+3

Work noun · deck+2

Useful message length+1

Score 8 · threshold 3Task

ASK_PATTERNScan you · please · quick review · by EOD

DESIGN_NOUNSdeck · slide · icon · homepage

GREETING_ONLYhello · thanks · okay · cool

COMPLIMENT_PATTERNSlooks great · love this · nailed it

Let corrections teach the tool my personal noise.

When I mark a card “Not a task,” the complete message is saved to an ignore list in SQLite. Future messages with substantial word overlap are skipped. The classifier rules remain fixed, while this personal layer grows one correction at a time.

  • Human feedback
  • SQLite ignore list
  • Similar-message matching
Expanded Daria's Desk task card with the Not a task action
Expanded card · correction becomes future filtering

Turn scattered messages into a board that feels alive.

Requests become draggable cards on an infinite canvas. Color, due dates, connections, light and dark modes, glowing new tasks, small jokes, and completion feedback make the board useful without turning it into another heavy project-management system.

  • Infinite canvas
  • Draggable cards
  • Useful daily feedback
Daria's Desk board with connected colorful task cards
Related tasks connected across the local canvas

Small signals make the system feel alive.

A task signals that it is still new.

A soft glow marks what still needs attention without adding another notification.

Finishing the work earns a small salute.

When a group is complete, the board answers with a brief celebration before settling down.

Keep the architecture small, readable, and local.

Python and Flask run the local server, SQLite stores the tasks and ignore list, and one HTML file with Vanilla JavaScript powers the interface without a framework or build step. Slack requires a network sync, but classification makes zero model calls and message content is not sent to an external AI service.

  • Flask + SQLite
  • Vanilla JavaScript
  • Zero model calls
System view05 / 06
(a.)Flask + SQLite
(b.)Vanilla JavaScript
(c.)Zero model calls

Small files → local processing → readable system

Take a private side project onto a public stage.

I demonstrated the working product at AI Tinkerers Berlin, including the Slack sync, classifier, database, and live board. It was later hand-selected from hundreds of eligible demos worldwide as a featured project.

  • Main-stage demo
  • Berlin · 17 Jun 2026
  • Global featured selection
View source on GitHub ↗
Daria presenting Daria's Desk at AI Tinkerers Berlin
Live product demonstration · AI Tinkerers Berlin

The best AI decision was knowing where not to use AI.

An agent helped me build the product, but transparent rules made the product itself faster, private, and easier to correct.