Hoojah has been my pet project since 2013. It has been rebuilt more times than I'd like to admit (this time on Rails 8 and Hotwire), and the latest version is live at hoojah.rudzainy.com. People keep asking me “so how does it work ah?”, so this is the walkthrough. What to click, what happens next, and sometimes why it works that way.
The name comes from the Malay word hujah, meaning argument. On Hoojah, a hoojah is a claim you put out into the world. Everyone else picks a side: Agree, Neutral or Disagree. Then they back it up with responses, each one tagged with the side it's on. And when two people really cannot let it go, they can take it to a one-on-one debate, round by round, while everybody else watches and decides who won.
That's the whole idea. The login page says it better than me: “Post a hoojah. Gather votes. Settle it in a debate.”
Quick note on colours: by default Agree is teal, Neutral is orange and Disagree is violet. You'll see those three everywhere, so it helps to know them early.
01 · getting in
Sign up and sign in
You can read almost everything without an account. To post, vote or argue, you need one.
Signing up. Go to /signup (or tap “Sign up” at the top right). Fill in your Full name, Username, Email address and Password (8 characters minimum), confirm the password, and press “Sign up”. Usernames take letters, numbers and underscores only. A few words like login, admin and api are reserved because the app uses them for its own pages. You also get a random default photo to start with, which you can change later.
Prefer not to make another password? Press “Continue with Google” instead. The first time you do this, Hoojah creates your account and picks a username from the part of your email before the @ (with a number tacked on if somebody already has it). If your Google email matches an account that already exists (and Google has verified that address), the two get linked.
Signing in. At /login you'll find the usual email and password, “Forgot password?”, “Remember me”, “Continue with Google”, and “Sign in with a passkey”. That last button only shows up if your browser supports passkeys.
The login page. Password, Google, or a passkey: pick your poison.
Passkeys. There's no passkey option on the sign-up form, so you add one after you have an account. Go to /settings/passkeys, give it a name in “Passkey name” (something like “My laptop”), and press “Add passkey”. Your phone or laptop will ask for Face ID, a fingerprint or a security key. Each passkey can be renamed or deleted later, and your password still works as a backup.
To sign out, open the menu under your avatar and pick “Log Out”.
02 · look around
Read the feed
The home page is the feed. Up top there are tabs:
Everyone: the global feed, hoojahs from everybody.
Following: your own hoojahs plus the people you follow. This tab only appears once you're signed in.
Discover: search and hashtags (more below).
Each card shows who posted it, the claim itself, and the three vote buttons. Along the bottom are small counts for votes and responses (plus a lightning bolt if anyone has cast a conviction vote, see section 04), and a “Jump in →” button. If two people are debating on that hoojah right now, you'll see crossed swords and a “Live” strip with who's fighting and which round they're on, and “Jump in” takes you straight into the debate.
The feed while signed out, with the purple sign-up banner on top and Trending in the sidebar.
Trending. On a wide screen, Trending sits in the right sidebar. On a phone it's the little flame button in the navbar, or go to /trending. It ranks public hoojahs with activity in the last 48 hours: votes and responses push a hoojah up, age pulls it down, and the top 10 make the list. It refreshes every 15 minutes. Honest disclosure: right now it mostly says “Nothing trending yet.” because, well, it's a quiet little site. Help me fix that lah. 😂
Discover. The Discover tab (/search) has a “Search Hoojah” box plus rows of trending and browse-able hashtags. Search only ever returns things you're already allowed to see, so private stuff stays private. Tap any hashtag, here or inside a hoojah, to see every hoojah tagged with it.
Discover: search, plus trending and browse-able hashtags.
03 · say something
Post your first hoojah
Two ways in. On the feed there's a box that asks “What's your hoojah?”: type and press “Post”. Or tap “New Claim” (the speech bubble with a plus) in the navbar for the full composer at /hoojah/new. The little expand icon on the feed box opens the same thing.
The full composer has a few extra knobs:
Who can see this. Under your name, pick Public (the default), Followers, or Private. Followers-only and private hoojahs get a small icon on the card so nobody is confused about who can see them.
Formatting. Bold, Italic and Underline. Simple je.
Length. A hoojah needs at least 8 characters. Not much, but “ok” is not a claim.
Add image. PNG, JPEG, GIF or WebP under 5 MB, with optional alt text up to 200 characters. Please write the alt text. Your screen reader friends will thank you.
Hashtags and mentions. Type #something and it becomes a link to that hashtag's page. Hoojah may also show “Suggested hashtags” you can tap. Type @username and that person gets a notification that you mentioned them (once per hoojah, up to 10 people, and never someone who blocked you or whom you blocked).
How people will weigh in. This shows the three words people vote with. After you've posted 10 regular hoojahs, you unlock custom stance labels: swap Agree / Neutral / Disagree for your own words, up to 24 characters each. Until then the three words are fixed.
Allow debates. A toggle in the footer, on by default. Switch it off and nobody can challenge the responses on this hoojah to a debate.
Hit “Post” and you're live. Your first one earns the “First Hoojah” badge. 🥳
Typo? You get 15 minutes to fix it with “Edit hoojah” in the ⋯ menu, and the post gets a small “edited” marker. I also close that window the moment anyone casts a conviction vote, because to me it wouldn't be fair to change the claim under someone who just locked in a permanent vote on it.
Regret? “Delete hoojah” is in the same menu, but it only works while the hoojah has no responses (yours included) and no debate. Once arguments are hanging off it, it's not only yours anymore. For a top-level hoojah, the same menu also lets you change who can see it later. Making it more private can permanently remove votes and arguments from people outside the new audience, and it isn't allowed once other people's replies or a debate are tangled up in it. So think before you tighten.
04 · pick a side
Vote, and why it's a secret ballot
Every hoojah has three buttons: Agree, Neutral, Disagree. Tap one. Your choice gets a soft tint, a ring and a ✓, and the other two dim. Changed your mind? Tap another one. The latest tap is the one that counts.
You can vote straight from a feed card, or open the hoojah and use the big “Where do you stand?” panel.
A hoojah page. Four votes in, so the split is showing: 50% agree, 25% neutral, 25% disagree.
Conviction votes. On a hoojah's own page, the panel says “Tap to vote · hold to charge a conviction vote”. Here's how holding works:
Press and hold a stance button. For a second or two nothing much happens, then an empty ring appears. Keep holding.
At about two seconds the ring starts counting down from 5 to 1 while it says “charging”.
Hold until the end and you get “Conviction vote!”. Let go early and it cancels, and no vote is cast at all.
Already voted normally? Hold the same stance to upgrade it. Your profile keeps count of how many of your votes were cast with conviction, and the hoojah shows a ⚡ conviction counter.
Why it's a secret ballot. Nobody sees how you voted, not even the person who posted the hoojah. Two things make that work:
When you vote, the author gets “You have a new vote on your hoojah”. No name attached. The app deliberately doesn't record who triggered it.
The percentages only show up once a hoojah has 3 or more votes. Below that you just see “No votes yet” or “2 votes”. Same rule for the author. With only two voters, a percentage split would basically tell you who picked what, so it stays hidden until there's a small crowd to hide in.
One more rule: you can't vote on hoojahs from someone you've blocked, or someone who blocked you.
05 · back it up
Respond with a stance
Here's the house rule: you vote before you argue. Until you've voted, the response box on a hoojah page shows a lock and “Vote to join the argument”, with three stance shortcuts that jump you to the vote panel. Pick a side first, then talk. Fair, kan?
Once you've voted:
Tap the “Make your argument…” pill. It opens a box headed “Post this response as”, with Agree / Neutral / Disagree chips already set to your vote. You can change it if your response leans differently.
Write your piece (Bold, Italic and Underline work here too) and press “Send”.
Want more room? “Respond on a full page” opens the same thing on its own page.
Your response shows up with a coloured edge on the left in your stance's colour, and the stance written next to your name. The hoojah's author gets a notification that you posted a new argument on their hoojah, and your first one earns the “First Argument” badge.
Responses are hoojahs too, sort of. People can vote on them (same 3-vote rule before percentages show) and reply to them, so arguments grow into a little tree.
Responses on a phone. The coloured edge tells you which side each one is on before you read a word.
Filtering. Above the list, “Responses” shows a count and four pills: All, Agree, Neutral, Disagree. Tap one to see only that side. It's instant. Great for when you only want to read the people who disagree with you (character building, this one).
06 · settle it
Escalate to a debate
This is the part I've wanted to build since the very first version. Sometimes a reply thread just goes round and round. So take it outside: one on one, turn by turn, with an audience.
You can challenge anyone who responded directly to a hoojah, as long as it isn't your own response and the hoojah still has debates allowed. Here's the flow.
1
Challenge
Under their response, click “Challenge to debate”. A “New debate” page opens showing the response you're challenging and the hoojah as “The motion”. Pick your stance (it has to be different from theirs, you're the opposition after all), pick 2, 3 or 5 rounds (3 is the default), and write your opening argument in up to 500 characters. There's no turn timer yet. Then press “Send challenge to @username”.
2
Accept or decline
They get a notification that you challenged them, with Accept and Decline buttons right there. The debate page shows the same choice. While you wait, your side says it's waiting for them to accept. If they decline, you get told, and that's that.
3
Take turns
Once accepted, your opening argument automatically becomes turn 1. Then you alternate, two turns per round. Round 1 is the “Opening statement”, the last round is the “Closing statement”, and the rounds in between alternate between “Counter-argument” and “Response”. Only the person whose turn it is sees the box: write your turn and tap the send arrow. The other side gets a notification that it's their turn.
4
Extend, if you need to
When the closing round starts (before either of you posts in it), either of you can press “Extend by one round”. One click from either side is enough. The cap is 10 rounds, after which it says “Maximum rounds reached”.
5
Conclude
Posting the final turn ends the debate automatically. Either of you can also press “Conclude” at any time to wrap it up early. Both debaters earn the “First Debate” badge.
6
The verdict
Now the crowd decides. Any signed-in person who can see the debate, and wasn't in it, gets a “Spectator verdict” card with three buttons: the challenger, the opponent, or “Draw”. One vote each, and it can't be changed.
The verdict stays sealed until at least 3 spectators have voted. After that it shows the winner with a little crown and the percentage split (or “Draw” if it's tied), plus a line saying how many spectators decided it over how many rounds. Same logic as the vote split: no tiny crowds that give away who voted for whom.
Spectators can watch live. An active debate isn't hidden. Anyone who can see both debaters and the hoojah can open it and watch the turns land in real time, no refresh needed. They just can't vote on the verdict until it's over. The debate page has the two of you side by side as Challenger and Opponent, the current round and phase, and a pulsing “LIVE” pill.
Small nerd aside: the round, phase and whose turn it is aren't stored anywhere. They're worked out from the turns every time the page loads, so extending a round can never leave a stale “Closing statement” label lying around.
Debates show up in a few places: a “Debates” section on the hoojah page (with how many are live and how many concluded), an “In debate” chip on the challenged response, a Debates tab on each profile, and a live card on the debaters' profiles while it's running.
Confession: as I write this, nobody has had a public debate on the live site yet, which is why there's no screenshot here. Somebody please be the first. I'll watch. 🍿
07 · your geng
Your people: follow, private accounts and block
Follow. On anyone's profile (/u/username), press “Follow”. It turns into “Following”, and their hoojahs start showing up in your Following tab. Press it again to unfollow (it asks first). They get a notification that you started following them, and their first follower earns them the “First Follower” badge. The two little counts under a profile open the lists of followers and people they follow. On your own followers list, each person has a “Remove” button if you'd like them gone without making a fuss.
Private accounts. In your profile settings (section 08) there's a checkbox to make your account private, so you approve followers before they see your hoojahs. Once that's on:
When someone presses Follow on your profile, their button says “Requested” instead.
You get a notification with Accept and Decline buttons. There's also “Follow requests” in your avatar menu, with a count, which opens /follow_requests.
Requests you ignore expire on their own after 30 days.
People who don't follow you see your name, photo and a note that the account is private, but none of your hoojahs. Your hoojahs also never appear in Everyone or Trending.
Block. Next to Follow on any other profile there's a “Block” button. It doesn't ask for confirmation, so tap carefully. It flips to “Unblock” if you change your mind.
Your list of blocked people is at /blocks. Like /edit, there's no menu link to it yet, so type it in, or just unblock from their profile.
08 · your corner
Your corner: profile, notifications, dashboard, badges
Profile. Your profile is at /u/yourusername. Up top: your photo, name, handle, headline, location and link, then your badges and follower counts. Below that, a “Votes cast” card (with how many were conviction votes) and three tabs: Hoojahs, Responses and Debates.
My own profile. Three badges down, Debates still at zero. Awkward.
Editing it. On your own profile, press the gear (“Edit your profile”), or go to /u/yourusername/edit. In there:
Photo. “Change photo” to upload one, or “Take a photo” to use your camera. PNG, JPEG, GIF or WebP, under 5 MB. Once it's up you can “Change” or “Remove” it.
Fields. Full name, User name (yes, you can change your handle), Location, Link (must start with http:// or https://) and Headline (“Add some jazz to your profile!”).
Checkboxes. The private account switch from section 07, and “Email me about mentions, debates and moderation”.
Press “Save changes” and done. Remember that email, password and passkeys live separately at /edit.
Notifications. When something new comes in, a small dot appears on your avatar. Just a dot, never a number. Open the avatar menu and pick “Your notifications” (or go to /notifications). There's “Mark all read”, filter pills for All, Mentions and Debates, and a ⋮ menu on each one to delete it. You'll hear about new arguments on your hoojahs, anonymous votes, mentions, new followers and follow requests, badges, and debate challenges, turns and endings.
Dashboard. “Dashboard” in the avatar menu opens /dashboard, your own little stats page. Two numbers on top, “Total votes received” and “Followers”, then your “Top hoojah” and a breakdown for each of your hoojahs. Any hoojah with fewer than 3 votes just says “fewer than 3 votes” instead of a split. Same secret ballot reason as before: even you don't get to work out who voted what.
Badges. There are five, all one-offs. Hover a badge chip to see what it's for.
First Hoojah: posted your first top-level hoojah.
First Argument: posted your first argument on someone's hoojah.
First Custom Hoojah: posted a hoojah with your own stance labels.
First Follower: gained your first follower.
First Debate: concluded your first debate.
Dark mode and colours. Top left of the navbar there's a small pill with two buttons, and they work even when you're signed out. The sun-and-moon one toggles dark mode. The palette one cycles the colour scheme: Spectrum (the default teal, orange and violet), Signal (green, amber and rose) and Ballot (a more muted sage, ochre and clay). Your choice is remembered in your browser.
09 · pass it on
Share and flag
Share. On a hoojah page, tap the share icon. You get “Share…” (your phone's own share sheet, if your browser supports it), WhatsApp, X, Telegram, Reddit, Facebook and Email. The link is a short one that redirects to the hoojah, and the message ends with “Do you AGREE? NEUTRAL? DISAGREE?”, which, honestly, is the most effective bait I've ever written. Feed cards have the same options in their ⋮ menu, and profiles and concluded debates have their own share menus too.
Flag. If something's off, open the ⋯ menu on the hoojah (or ⋮ on a feed card) and choose “Flag this hoojah”. Pick a reason:
It's suspicious or spam
It's abusive or harmful
It's irrelevant to the parent hoojah
If the hoojah has an image, there are two more: the image is graphic or explicit, or the image isn't theirs to post. You'll see “Hoojah flagged. Thank you.” and a moderator takes it from there. Flag it for one of the two image reasons and the image gets veiled (“Image hidden while we review a report”) until a moderator looks, though anyone can still tap “Show anyway”. You need to be signed in to flag; signed out, the menu item says “Login to flag this hoojah” instead.
10 · yet to be concluded
Yet to be concluded
That's Hoojah as it stands today. If you'd rather learn by poking around, there's also a short in-app guide at /tutorials.
Next on my list is Hotwire Native, so Hoojah can live on your phone as a proper app instead of a browser tab. Haven't started yet. Let's see where it goes.
In the meantime, jom, go post something you're sure about at hoojah.rudzainy.com. Then hold that button. ✌️