MentorMe
·3 min read

The Post Composer — Lessons From Building a Better Community Editor

Attachments, links, polls, video, GIF — what a modern community editor should actually do.

communityUXMentorMe

Most community editors are embarrassing. A text box, a post button, and maybe an image upload if you're lucky. It's 2026 and the majority of community platforms still ship an editor that feels like a 2012 forum.

We built MentorMe's post composer because the defaults weren't good enough. Here's what we learned building it, and what a modern community editor should actually do.

Start with the premise. A community post is not a tweet, not a blog post, not a Slack message. It's a hybrid. Members want to share a quick update, a long-form teardown, a photo, a video, a link to something they built, a poll to gauge opinion, sometimes all in the same post. An editor that forces them to pick one type of content is an editor that makes them post less.

So we shipped with six attachment types from day one. Images, with inline preview and automatic compression. Video, with transcoding to a streamable format so nobody waits on a 200MB MOV. GIFs, because community culture runs on them. Links with rich previews, so a shared Substack or YouTube video renders as a card instead of a raw URL. Polls, because questions are how communities learn. And code blocks, because we're mostly technical builders and plain-text code in a paragraph is an insult.

Building this sounds straightforward. It isn't. The hard parts are the ones nobody thinks about until they're already in production.

"The answer is a server-side vote record with RLS policies that let the user see their own vote, let the system count all votes, and let nobody else see the join."

Video uploads are a state machine, not a file upload. The user drops a 90-second screen recording, and between the drop and the post there are six states the UI needs to handle. Uploaded to storage. Queued for transcode. Transcoding. Transcoded. Thumbnail generated. Ready to embed. If you don't show progress for each, users think it's broken and refresh. If you let them post before transcode finishes, the post renders a broken video until the job completes. We ended up with a background worker in Supabase that updates the post record when the asset is ready, and the UI subscribes to that record via realtime so the broken state never flashes.

Link previews are a proxy-and-cache problem. You can't call the third-party URL from the client because of CORS. You can't call it from the server every time because of rate limits and latency. We run it through an edge function that fetches the Open Graph tags, caches them in Postgres for a week, and returns the cached version on subsequent requests. The cache hit rate is over 90% because community members tend to share the same links to each other.

Polls are surprisingly hard because of the anti-gaming requirements. Anonymous polls need to count one vote per user without revealing who voted what. You can't use a client-side flag because people wipe cookies. You can't show the user list to other users because it's supposed to be anonymous. The answer is a server-side vote record with RLS policies that let the user see their own vote, let the system count all votes, and let nobody else see the join. Supabase RLS did this in about 15 lines of SQL.

The GIF picker is powered by Tenor. We debated building our own. We stopped debating when we realized Tenor's free tier covers our volume and their search quality is better than anything we'd build in a week.

56%

Wage premium for AI-skilled workers

The code block needed syntax highlighting, language detection, and a copy button. We use Shiki on the server for the highlighting so no JavaScript bundle bloat in the client. Language is autodetected but overridable. Copy-to-clipboard is a two-line component that nobody should have to write in 2026 but everyone does.

The biggest lesson. The composer is not the feature. The feature is what members post. If the composer is friction, members don't post. If it's fast and forgiving and handles the messy real-world inputs (big videos, weird links, mobile uploads from a bad connection), members post three times more. We measured this. Our composer rewrite increased posts per active member by 2.4x in the first month.

Action step: open your community platform's composer and try to post a video, a poll, and a code block in the same post.

Start free at mentorme.com — community, 2 courses, AI Operator Stack, and the skill library.

Related reading