asopi tech
asopi techIndie Developer

Asopitech With · Team chat

Slack with Alopex DB & Alopex Chirps

Slack is a chat that gathers work conversations into channels. What would it look like built on Alopex DB and Alopex Chirps?

Updated: Oct 12, 2026

What the service does

In a Slack-like chat, work conversations gather in channels. Channels are created per team or project, and people who join later can scroll back through earlier conversations. There are threads, file sharing, and search and summaries of conversations. The data is workspaces, channels, members, messages and threads.

Where the data lives

  • SQL tables: workspaces, channels, members, messages and threads live in tables. Showing a channel is a range read by channel and time.
  • Vectors: message embeddings sit in a vector column, so a question such as “the release steps we agreed on the other day” is searched within a channel.
  • Full-text search: names and exact words are found through full-text search.
  • Columnar tables: messages per channel and usage over time are aggregated.

The app creates the message embeddings and writes them in the same transaction as the message rows.

Deployment

As workspaces grow, the database scales out to an Alopex DB cluster. Nodes joining and leaving, and schema changes, move forward by agreement across the cluster. Reads are routed to the node that holds the data. Chirps, a related product, carries communication between nodes. The app uses the same SQL in every form.

Why Alopex DB and Alopex Chirps fit

A chat starts with a small team and grows as usage spreads. Alopex DB takes a database started on one server to an Alopex DB cluster with the same SQL. Conversations and their semantic search always live in the same place.

See it in code

Conversations and their semantic search live in Alopex DB (node-to-node delivery via Chirps). Just the core of channel-scoped semantic search.

import alopex
import numpy as np

# 会話とその意味検索は Alopex DB(ノード間の配送は Chirps)
db = alopex.Database.open("slack.alopex")

db.execute_sql("""
    CREATE TABLE IF NOT EXISTS messages (
        id INTEGER PRIMARY KEY,
        channel TEXT,
        author TEXT,
        body TEXT,
        posted DATE,
        embedding VECTOR(4)
    )
""")

messages = [
    (1, "release", "aya", "リリースの手順を決めた", "2026-10-18", [0.9, 0.1, 0.0, 0.0]),
    (2, "random", "ken", "お昼どこ行く?", "2026-10-19", [0.0, 0.0, 0.9, 0.1]),
    (3, "release", "mio", "次のリリースは金曜", "2026-10-20", [0.85, 0.15, 0.0, 0.0]),
]
for mid, channel, author, body, posted, emb in messages:
    db.execute_sql(
        "INSERT INTO messages (id, channel, author, body, posted, embedding) VALUES (?, ?, ?, ?, ?, ?)",
        [mid, channel, author, body, posted, np.array(emb, dtype=np.float32)],
    )

# 「リリースの手順」に近いメッセージを、release チャンネルに絞って意味検索する
query = np.array([1.0, 0.0, 0.0, 0.0], dtype=np.float32)
rows = db.execute_sql("""
    SELECT author, body, vector_similarity(embedding, ?, 'cosine') AS score
    FROM messages
    WHERE channel = ?
    ORDER BY score DESC
    LIMIT 2
""", [query, "release"])

for row in rows:
    print(round(row["score"], 3), row["author"], row["body"])

Scoped to a channel, you can find messages by meaning. Node-to-node communication and scaling to a cluster are handled by Chirps, as the prose describes.

We recommend Alopex DB for chat: semantic search over conversations in the same SQL, scaling out to an Alopex DB cluster. Start small with the quickstart.