Knowledge community · web and mobile · Case study

Designing a community before it had any members.

Duggup is a knowledge-sharing community for software engineers, data scientists, DevOps engineers and technical leads. I joined as founding product designer and shipped v1.0 across web and mobile, working with Arpit Bhayani.

Product
Duggup
Role
Founding product designer
Timeline
6 months · v1.0 at five
Platform
Web and mobile
Tools
Figma · Framer
Built with
Arpit Bhayani
Two iPhones showing the Duggup launch screen and a member profile with answer count, followers, topics and a streak
Fig. 01Duggup v1.0 on iOS. The profile is the screen that has to look inhabited before anybody has inhabited it: answers, followers, topics and a streak, all visible before you scroll.

Product render from the shipped v1.0 · every capture below is from the mobile build · harvested from the published case study, July 2026

01

The room was empty

Engineers who have been doing the work for a decade want to pass some of it on. People three years behind them want to find it. Both groups are large, and they mostly miss each other, because the places they meet are tuned for something else: reputation on Stack Overflow, argument on Hacker News, reach on LinkedIn.

That was the pitch, and the pitch was not the hard part. The founding design problem was smaller and worse. A community product is worth nothing on the day it launches and has to feel worth returning to anyway. Every screen had to hold up with almost nothing in it, and then keep holding up once it filled.

An empty feed is not a problem you can style your way out of. It is a problem about what the product asks a person to do in the first ten seconds.

So the work split into two questions that ran through everything else. What is the cheapest useful thing a new member can contribute, and what gives them a reason to come back that does not depend on anyone else having shown up yet.

FEED, TUNED BY TOPICSTREAKS KEEP PEOPLE COMING BACK30-day challenge · day 21CHALLENGES · LEADERBOARD010203
Fig. 02The system as one loop rather than three features: a feed tuned by topic, a streak calendar that fills as you use the product, and challenges that put the streak in front of other people.
02

Who it had to work for

Not “developers”. The brief named roles and career stages, and those two axes decided what the first screen was allowed to assume about the person reading it.

01 / Roles

Engineers, and the jobs next to engineering

Software engineers, data scientists, DevOps engineers and technical leads. Adjacent enough to share a feed, different enough that topics had to do real filtering work.

02 / One to seven years

Arrives to find things

Reads far more than it writes. Will contribute, but only while contributing stays cheap and the result does not sit there with nothing under it.

03 / Seven years and up

Arrives to pass things on

The scarce input, and the first to leave. Writes something considered, and stops writing if it lands in front of nobody.

Those two halves want opposite things from the same launch. The junior half needs the room to already have content in it. The senior half needs the room to already have readers in it. Neither is true on day one, and only one of them can be faked, which is why the design leans on the cheap end of the ladder rather than on the expensive end.

03

What I actually knew

Secondary research, no primary interviews. I would rather write that down plainly than describe a study I did not run.

What I did do: competitor analysis across Quora, Hacker News and Stack Overflow, looking at how each one ranks contributions and what behaviour that ranking produces. Reading technical community discussions on Reddit and specialist blogs. Published surveys and reports on tech careers, for the upskilling and discovery complaints people write down when nobody from the product is in the room.

Four problems kept recurring, and they became the frame every feature was argued against.

01 / Overload

Too much, none of it aimed

Plenty of material exists. Almost none of it is filtered to what this person is working on right now.

02 / Stagnation

No visible next step

People could describe the job they had and not the one after it. Growth had no shape they could point at.

03 / Drift

Learning with no structure

Stacks move faster than anyone’s reading habit. Without a system, upskilling becomes a browser full of open tabs.

04 / Isolation

Remote removed the corridor

The informal knowledge that used to travel between desks does not have a replacement, and mentorship went with it.

Source: competitor analysis, technical community forums, and published career surveys · no primary user interviews were conducted

What that costs the rest of this page: every problem above came from reading, not from talking to a user. The decisions below are real and they shipped, and the evidence under them is second-hand. Section 08 says what I would test first if I picked it up again.
04

Four ways in

The empty room gets solved by making the cheapest useful contribution genuinely cheap, and then giving that contribution somewhere to grow. Duggup ended up with four ways to put something into the product, and the distance between the bottom rung and the top one is the whole design.

FOUR WAYS IN, ORDERED BY WHAT THEY COSTSECONDSTickpaste a linkMINUTESPosttoday I learnedLONGERAnswersomeone's questionDAYSChallenge30 days, in publicAll four land in the same feed. The three in blue need nobody else present.
Fig. 03The ladder. A link costs seconds, a challenge costs a month, and the three marked in blue can all be climbed with no other member present.
Fig. 04The four rungs, as shipped
The Duggup ticker: a ranked list of community-submitted links with vote counts, comment counts and a bookmark action

Rung one. A title and a URL, ranked. The shape is borrowed on purpose: this audience already knows what to do with it.

A Duggup post tagged Today I Learned, describing an open-source key-value store, with a linked video attachment and topic tags

Rung two. A short written post about one thing you learned, with room for an attachment and tags.

The Duggup answer composer showing a question, Markdown and Preview tabs, a saved indicator and an attachment slot

Rung three. Answering someone. The one rung that needs another member to have gone first.

A Duggup challenge page for 30 Days of System Design showing duration, participant count, an opt-out control and a posts tab

Rung four. A commitment measured in weeks, made in front of other people.

Decision 01

Make the cheapest contribution a link

The bottom rung had to cost about ten seconds, because anything more expensive will not happen on a platform with no audience yet. A tick is a title and a URL.

It earns its place twice. It fills the room, and it gives the people who will never write a post something real to do, which keeps them in the product long enough to read one.

Fig. 05The ticker, end to end
The Duggup ticker list with Top and New tabs and a Submit button

Top and New, and a submit button that is never more than one tap away. Ranking is the only editorial control.

A Duggup modal titled Submit a link with a title field and a URL field

Two fields. Adding a third would have moved this rung up the ladder, which is the one thing it could not afford.

A Duggup tick detail page showing the submitted link above a threaded comment discussion with replies

The thread underneath is where ten seconds of effort turns into a conversation. That is the reason the cheap rung comes first.

Decision 02

Ask a narrower question than “post something”

An empty box gets nothing from a person who is not sure they have anything worth saying. The composer asks a smaller question and hands over three ready-made answers to it.

Naming the kinds also makes the feed filterable later, so the same control that lowers the barrier to writing is the one that makes reading tolerable at scale.

The top of the Duggup post composer, asking what do you want to share, with three options: Today I Learned, Today I built, and Today I read
  1. 01 / The promptToday I learned, today I built, today I read. Each one is a sentence someone can already finish.
  2. 02 / The defaultOne is preselected, so the screen is never asking a question the reader has to answer before they can start.
Fig. 06The first control in the composer is not a text field. It is a choice between three things a working engineer does every week.
Fig. 07Composing a post
The Duggup post composer showing post-kind options, a Markdown editor with a character counter, an attachment slot and a challenge selector

One column, in the order a person actually works: what kind, then the writing, then the extras.

The lower half of the Duggup composer showing an attached video, a challenge selector and a tag field with an AI suggestions control

Tags are the thing people skip, so the field offers suggestions rather than demanding vocabulary.

A Duggup drafts list showing five saved questions, each with edit and delete controls

Drafts exist because the top two rungs take long enough to be interrupted. Losing that work once is enough to stop someone writing again.

Decision 03

Let the audience write the way it already writes

The answer composer is markdown with a live preview, and attachments are capped at two. Engineers paste code, and code that does not survive the paste is the fastest way to lose the person you most wanted to keep.

The preview tab is not a nicety here. Markdown without a preview asks the writer to hold a rendering engine in their head while composing a technical explanation.

Fig. 08Writing an answer
The Duggup answer composer with the question pinned above, Markdown and Preview tabs, a saved state and a submit action

The question stays pinned above the editor, so a long answer never drifts away from what was asked.

A finished Duggup post showing formatted text, an inline link, a video attachment card and topic tags

The published result. Formatting, links and attachments all survive, which is the only proof the composer worked.

05

Reasons to come back

Contribution solves the first visit. Retention is a different problem, and on a platform this small it cannot be built on other people showing up, because most days they will not.

Decision 04

Give people a clock that is not other people

Challenges run 7, 14, 30 or 100 days. Joining one is a commitment you make to yourself, in public, with a leaderboard and a participant count next to it.

It works at 32 participants and it works at 32,000, which is the property the rest of the engagement layer did not have. Leaving is a first-class action rather than something you accomplish by going quiet.

Fig. 09A challenge, joined and left
The Duggup challenges list with Popular and New tabs, a topic filter, and challenge cards showing creator and participant counts

Popular and New, filtered by topic. The participant count is on the card because it is the thing that decides whether you join.

A Duggup challenge detail page showing the brief, duration, a write-a-post action, participation state and posts and leaderboard tabs

Your own participation state sits next to the action, so the page never makes you guess whether you are in.

The activity tab of a Duggup challenge, showing a streak calendar of filled squares across September and October

Activity is scoped to the challenge, so a 30-day commitment gets its own 30 days rather than a lifetime graph.

A Duggup confirmation dialog asking whether to opt out of a challenge, with cancel and opt-out actions

Opting out is confirmed once and then done. No penalty screen, no persuasion, no dark pattern on the way out.

The Duggup create-a-challenge screen with a yellow banner stating that creating a challenge requires more than 1000 followers, above the challenge name field
  1. 01 / Stated up frontThe requirement is the first thing on the screen, not a validation error after the form has been filled in.
  2. 02 / What it protectsA challenge with no audience is a leaderboard of one. The gate holds creation back until someone has people to finish in front of.
Fig. 10Joining a challenge is open to everyone. Starting one is not, and the product says so before the form rather than after it.
Decision 05

One activity graph, at four densities

The same object appears as a single line on a profile, as a week when that line is expanded, as quarters on its own page, and scoped to a challenge inside the challenge.

It is deliberately the graph engineers already read every day on their own contribution profiles. Borrowing the shape meant nobody had to be taught what a filled square means.

A quarter of the Duggup activity graph, October to December, laid out as seven weekday rows of dated squares in four shades of blue
  1. 01 / Weekday rowsRows are days of the week, so a habit that only happens at weekends is visible as a band rather than as scatter.
  2. 02 / Readable at restThe date sits inside the square. Nothing about the graph depends on a pointer, which is what made it survive onto a phone.
Fig. 11One quarter of the full history. Intensity is carried by fill weight, and the day numbers stay legible inside the squares rather than being hidden behind a hover.
Fig. 12The same graph, three sizes
A Duggup profile showing answer, follower and following counts, topic tags, a follow button and a collapsed streak row reading three days

On a profile it is one line. A streak count earns its place next to follower counts without taking a section.

The full Duggup streak page showing three quarterly activity graphs stacked, from April through December

Its own page is quarters, stacked. This is the only place the full history is worth the vertical space.

A Duggup challenge activity tab showing a two-month streak calendar with a less-to-more intensity legend

Inside a challenge it is scoped to the challenge, so the graph answers the question the page is actually about.

Decision 06

Answer before the query

Search is where a small platform looks smallest, because an empty result is a very clear statement about how much is here. So the search screen does not wait to be asked.

It opens with trending questions and people worth following, and the wait itself is designed rather than left to a spinner. On a slow query the loading state is the experience.

The Duggup search screen before any query, showing a banner reading here is something interesting for you above a list of trending questions with topic tags
  1. 01 / Surprise meThe entry point for a person who does not have a query, only an idle minute.
  2. 02 / Tagged resultsEvery suggestion carries its topics, so one tap turns serendipity back into a filter.
Fig. 13No query typed, and the screen is already useful. The alternative was a cursor blinking in an empty field on a platform with not much behind it.
Fig. 14Search, in three states
Duggup search with a partial query typed, showing All, People, Questions, Topics and Answers tabs above people results

Typed query. Results are split by kind, because looking for a person and looking for an answer are different jobs.

The Duggup search loading state, a banner reading finding something interesting for you above skeleton placeholders shaped like result cards

The wait, drawn as the shape of what is coming. A spinner tells you nothing is happening yet; this tells you what will be there.

Duggup search results with no query, showing trending questions and suggested people to follow

The answer. Same layout as the skeleton, so nothing jumps when it lands.

06

The part that took money

Events were the one place where the product stopped being social software and became a transaction. Community meetups and summits, online and in person, with seats, prices and a real checkout behind them.

Tolerance for a vague screen goes to zero once money is involved, and the surrounding product was still new enough that a person had no reason to extend it any trust. So the flow states everything before it asks for anything, and stays reversible after the payment lands.

  1. BrowseFiltered by meetup, summit or the ones you are already registered for. Seats remaining and a filling-fast, open or closed state sit on the card, before the tap.
  2. EventDate, time, seats, venue and a map link above the description. Speakers and host below it, because who is running it is the thing a paid ticket is actually buying.
  3. RegisterEmail, phone, currency and an optional GST number. The refund policy is a checkbox on this screen, not a link found afterwards.
  4. CheckoutTicket price, tax and total broken out separately, with the contact details repeated and editable in place.
  5. ConfirmationAn order ID and a date, then the event page itself changes to registered and offers a cancel. The exit is visible from the moment the money clears.
Fig. 15Browse to paid, five screens
The Duggup events list with All, Meetup, Registered and Summit filters, showing event cards with seats remaining, date, venue and price

Seats and status are on the card. A closed event says so before it costs anyone a tap.

A Duggup event detail page with a photograph, date, time, seats remaining, a maps link, a description and a register action

The commercial facts sit above the description, in a fixed order that repeats across every event.

The Duggup event registration form with email, contact number, refund policy checkbox, currency selector and GST number field

Currency and tax identity are asked once, here, rather than surfacing as a surprise at the payment step.

A Duggup checkout screen itemising ticket price, GST at eighteen percent and total payable, above editable contact details and a pay action

Tax is a separate line. The total is the last thing read before the only irreversible button on the flow.

A Duggup payment success dialog showing the amount, the event name, an order ID and an order date, above a registered state with a cancel option

Order ID, date, and a cancel route still on the page. Paying is not designed as the end of the person's control.

07

What it was measured on

The team tracked daily and monthly actives, session length, frequency of use, retention and churn, in Amplitude. Those were chosen before launch, which matters more than the list itself: the engagement layer was designed against retention and churn rather than being decorated and measured afterwards.

Also project-reported: v1.0 shipped roughly five months in, and a shared system between web and mobile cut about half the time spent re-testing and redrawing the mobile version. Both come from my record of the engagement, not from a document I can link to.

What this record is missing

Every capture on this page is from the mobile build. The web product shipped, parity between the two was the part of the engagement I was most pleased with, and no capture of it survived into the archive this case study was rebuilt from.

I would rather say that than put a phone screen under a caption about the web app. The claim about cross-platform parity is therefore a claim, not something this page shows you.

08

What I would validate first

The honest weakness of this project is section 03. Every decision on this page is defensible from first principles and from how comparable products behave, and not one of them was checked against a person in the target audience before it shipped. On a product about human motivation, that is the gap that matters most.

What I took away is narrower than the feature list suggests. The useful move was ranking the ways in by cost and then designing the cheapest one properly, instead of designing the most impressive one and hoping the cheap end took care of itself. If I picked this up again, I would start with the questions below rather than with a new feature.