Don't rebuild Slack
Don't rebuild Slack if the company already lives there. A campfire for a focused group is 4 days. Presence, search, and unread cursors stay paid.
Don’t rebuild Slack if twelve coworkers already treat the search box as the record. Slack is that product. The catalog line is “Your team may need three channels, not 3,000 integrations.”
You pay $15–$18 a person a month. That price scales with the team. The verdict on the card is “Only for a focused team”.
Earlier today I wrote about how Zapier works. That was a teardown. This one is a regular backlog topic about who will actually leave.
Don’t rebuild Slack if the company lives there
The homepage puts it in one line: keep the hard stuff and build the tiny stuff.
Chat is other people’s source of truth, the same way Linear is for issues and Notion is for pages. You can vibe-code rooms, and you still cannot move the history twelve people already search.
I already used Slack as the “do not start here” example in what to vibe code first. The Slack teardown is the architecture half: channels and messages versus presence, search, unread cursors, and fanout.
A campfire only works if those people will move.
How Slack becomes a source of truth
A new hire learns the company by searching old threads. Last March’s decision is still sitting in #eng, next to a guest from the agency and a bot that posts deploys.
The 4-day row is a room, a list of posts, and replies hanging off a parent. That company history is not in it.
The hard half is already paid for: presence, company-wide search that cannot leak #leadership, unread cursors that only move forward across three devices, guest accounts, an app directory, and years of messages.
If you ship a campfire and the company stays in Slack, you now have two chats. People paste the same sentence in both, then forget which one had the answer. The paid workspace stays the record. Your rooms go quiet after the first week.
When a Slack alternative is worth it
The audience line on the page is specific. A small internal team that wants searchable asynchronous conversation.
The goal is a handful of durable topic channels, not a chat ecosystem.
I would ship this for four people who currently paste into a group DM they do not own. They can pick a Monday. They will open the new URL because the old thread is a mess they do not control.
I would not ship this for a company Slack with guests, bots, and a search box everyone already trusts.
The test I would run is boring. Name the three channels. Name the people. Ask each person, in writing, if they will stop opening the old app for that work. One “I’ll keep a tab in both” is a no.
The card names the project Campfire, and that is the size I would ship.
What a campfire actually includes
The Slack page splits the work into three rows.
The first row is 4 days. Channels, messages, threads. Public and private rooms. Membership checked on the server. A uniqueness constraint so a retry is not a double post.
The second row is 2 weeks and up. Reactions, file uploads, search, unread markers. Still a campfire.
The third row is 3 months and up. Voice calls, an app platform, mobile apps. Skip that row.
If you tell an agent to “clone Slack”, it aims at the third row. Copy the prompt, then pin it to the first one.
Here is the shape of the data. Nothing else has to exist at 4 days.
const campfire = {
workspace: 'tiny-studio',
channels: [
{ id: 'C-eng', name: 'eng', visibility: 'public' },
{ id: 'C-lead', name: 'leadership', visibility: 'private' },
],
message: {
channelId: 'C-eng',
ts: '1792660800.000201',
user: 'U-flavio',
text: 'The booking page is live at https://flaviocopes.com/slot',
threadTs: null,
},
}
A person who is not in C-lead gets no name, no messages, and no 404 that confirms the slug. The guardrail on the page is explicit: treat private-channel authorization as a server-side invariant, and rate-limit posting.
function canReadChannel(memberships, userId, channel) {
if (channel.visibility === 'public') return true
return memberships.some((row) => {
return row.channelId === channel.id && row.userId === userId
})
}
canReadChannel(
[{ channelId: 'C-lead', userId: 'U-flavio' }],
'U-ada',
{ id: 'C-lead', visibility: 'private' }
)
//false
The catalog swaps green dots for an email digest. That is the trade I would take. Presence is a second product, and the teardown walks through Slack’s public docs on that.
Persist the message before you broadcast it. The mini-prompt on the page is “Persist first, broadcast second”. Kill the socket and retry, and you still have one row.
Slack alternative or a different product
A member community with spaces and a weekly digest is Circle. $99–$219 a month. Four days for spaces, posts, members, and digests. The same v1 also covers Skool and Mighty Networks.
A help button and a shared inbox is Intercom. $74–$139 a month. Four days for the button, the inbox, and replies. That also covers Crisp and LiveChat.
Support email is Help Scout. $25–$75 a month. Three days for inbound threading, assignment, and replies.
Issues stay in Linear. Pages stay in Notion. A Slack alternative does not replace those.
What not to build in a Slack clone
Leave out voice calls, app bots, external guests, enterprise retention controls, and mobile apps.
The non-goal on the page already names those. You are replacing a group DM, not the company switchboard.
If the agent starts a bot marketplace, stop it. Paste the non-goal again. The 3-month row exists so you have a sentence to point at.
Per-seat Slack pricing
The homepage lets you type a team size because that is how Slack charges.
Notion is $12–$24 per person per month. Slack is $15–$18. Figma is $16–$55. Twelve people on Slack is $180–$216 a month. That is $2,160–$2,592 a year before you add guests.
A focused rebuild for four people who will move can still make sense. A rebuild you have to sell to twelve coworkers is a different project. They will keep a tab open in the old app, and your campfire becomes a side channel that goes quiet.
Host it only after they say yes
The product pages put hosting this way: a focused replacement costs your build time plus close-to-zero hosting.
This one wants Astro, D1, and a Durable Object per channel, because that is the stack on the card. Use Rails if that is your weekday language. Private-channel checks stay on the server either way.
I would not start the build until the four people have agreed to move, because the migration is the people.
Then use it as the real chat for a week. If you miss unread markers, add them from the 2-week row.
Start here, or start somewhere else
If the group will move, go to Build your own Slack. Copy the AHA prompt, or the stack you already write.
Tell the agent the first estimate only: channels, messages, threads. Four days.
If the company already lives in Slack’s search box, keep paying. Pick a Tonight card from the audit instead. Shots.so is about 2 hours if the next bill is a screenshot frame.