· Tutorial

How to Use Hoojah

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.

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 Hoojah login page: email and password fields, a blue Log in button, Forgot password, Remember me, then Continue with Google and Sign in with a passkey below an or divider.
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”.

Read the feed

The home page is the feed. Up top there are tabs:

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 Hoojah feed while signed out: a purple sign-up banner, Everyone and Discover tabs, and hoojah cards with Agree, Neutral and Disagree buttons and a Jump in button. A Trending panel sits on the right.
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.

The Discover page: a Search Hoojah box, then Trending hashtags and Browse hashtags rows with #Malaysia, #Indonesia, #multimedia and #buku.
Discover: search, plus trending and browse-able hashtags.

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:

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.

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 single hoojah page: the claim with #Malaysia and #Indonesia hashtags, a Where do you stand panel with large Agree, Neutral and Disagree buttons showing 50%, 25% and 25%, the hint Tap to vote, hold to charge a conviction vote, then the Debates section and Responses filter pills.
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:

  1. Press and hold a stance button. For a second or two nothing much happens, then an empty ring appears. Keep holding.
  2. At about two seconds the ring starts counting down from 5 to 1 while it says “charging”.
  3. 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:

One more rule: you can't vote on hoojahs from someone you've blocked, or someone who blocked you.

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:

  1. 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.
  2. Write your piece (Bold, Italic and Underline work here too) and press “Send”.
  3. 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: a Responses 3 heading with All, Agree, Neutral and Disagree filter pills, then response cards with teal, violet and orange left edges and Agree, Disagree and Neutral labels beside the author's name.
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).

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. 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. 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. 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. 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. 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. 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. 🍿

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:

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.

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.

Rudzainy's Hoojah profile: a blue gradient header with photo, name, handle, headline, Kuala Lumpur and a link, badge chips for First Hoojah, First Argument and First Follower, then a Votes cast card reading 12 with 3 with conviction, and Hoojahs, Responses and Debates tabs.
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:

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.

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.

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:

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.

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. ✌️

more of Hoojah

01.09.2020
The Hoojah Project

The case study behind Hoojah.

Read more
03.01.2021
Kenapa Rudzainy Buat Hoojah

Sembang podcast Rakita 107.9.

Read more