DEV Community

Art Perev
Art Perev

Posted on

You Built a Project, Pushed It to GitHub, and Nobody Uses It. Here's Why.

A working application, a polished README, a configured CI/CD pipeline, and zero users. Sound familiar? Most developers eventually discover that building a product and getting people to use it are two completely different problems.

Imagine a developer building a small log analysis tool.

The first weekend produces a working prototype. A week later, it has filtering, search, and error visualization. A few more evenings go into Docker, authentication, and deployment.

Finally, everything is ready.

The repository goes public on GitHub. The README looks professional. There's even a live demo.

One week passes.

Three stars. No issues. No pull requests. No indication that anyone has actually tried the application.

The developer starts thinking about improvements. Maybe the interface needs redesigning. Perhaps the API should be rewritten. Maybe Redis would improve performance.

But what if the code isn't the problem?

Nobody can use a product they don't know exists.

And solving that problem requires a completely different approach.

GitHub Is a Code Hosting Platform, Not a User Acquisition Strategy

GitHub is excellent at what it was designed to do: version control, collaboration, issue tracking, code reviews, and repository management.

But publishing a repository doesn't mean people will discover it.

Let's say you've developed a CLI tool for cleaning up unused Docker images.

You understand exactly what it does and why it's useful.

But someone experiencing this problem might search for:

  • Why is Docker using 40 GB of disk space?
  • How do I free up space on my VPS?
  • How can I automatically remove unused Docker images?
  • What's the safest way to clean Docker storage?

Your project might solve all these problems, but your repository description could contain completely different terminology.

The solution exists. The demand exists. But potential users have no obvious way to connect the two.

This is where distribution becomes part of software development.

Mistake #1: Describing Features Instead of Problems

Consider two descriptions of the same project.

Version A:

DockerCleaner is a CLI utility built with Go, featuring scheduled execution, configurable filters, and JSON output.

Version B:

Running out of disk space because of Docker? This tool identifies unused images, shows what's consuming storage, and helps you clean things up without manually reviewing dozens of containers and images.

The first description explains technical capabilities.

The second explains why someone might need the product.

Both belong in good documentation. But when someone discovers your project for the first time, they need to understand its purpose immediately.

A useful README should answer four questions:

  1. What problem does this tool solve?
  2. When should someone use it?
  3. How can they get started in a few minutes?
  4. What are its limitations and risks?

That fourth question is particularly important.

A Docker cleanup tool could potentially delete resources that other processes depend on.

A safe preview mode using --dry-run, along with clear documentation of deletion behavior, may be more valuable to potential users than another export format.

Mistake #2: Making the First Run Too Complicated

Imagine two open-source projects offering similar functionality.

The first requires installing several dependencies, creating configuration files, configuring a database, and manually starting three processes.

The second provides a Docker Compose setup that launches the application with a single command.

Which one would you try first?

If the second project actually supports this workflow, its README might include:

git clone https://github.com/username/project.git
cd project

docker compose up --build
Enter fullscreen mode Exit fullscreen mode

This is an illustrative example, not a universal installation method. A CLI utility, JavaScript library, or hosted application may need a completely different setup.

The principle remains the same: reduce the effort required to experience the product's main benefit.

If possible, offer a working demo without requiring installation.

People should be able to evaluate your tool before spending an hour configuring their environment.

Mistake #3: Measuring GitHub Stars Instead of Actual Usage

GitHub stars are visible, easy to understand, and surprisingly addictive.

But a star doesn't mean someone installed your software.

People star repositories because they look interesting, because they want to read them later, or simply because they like the idea.

Meanwhile, another developer might use your tool for years without ever starring it.

A better approach is to distinguish between three stages:

Discovery: Someone finds your project.

Activation: They successfully complete their first useful action.

Retention: They return and use the product again.

Consider this hypothetical dataset for a small web application:

Metric Result
Visitors 500
Started using the tool 100
Completed their first useful action 30
Returned within seven days 8

The visitor-to-activation conversion rate is 6%.

Of the 30 activated users, approximately 26.7% returned within seven days.

These numbers are illustrative. A rigorous retention calculation also requires consistent user cohorts, observation windows, and definitions of returning activity.

Still, the example demonstrates why raw traffic numbers aren't enough.

If people visit your project but never start using it, the problem might involve onboarding, installation requirements, or unclear messaging.

If they install it but cannot complete the main task, the issue may lie in usability or functionality.

If users successfully complete their tasks but never return, that isn't necessarily a failure. Some utilities are designed for one-time problems.

Choose metrics that reflect what your product is supposed to accomplish.

Where to Find Your First Users Without an Advertising Budget

This is where many developers encounter an unfamiliar challenge.

The application works. Documentation is complete. The infrastructure is running.

Now what?

One practical approach is publishing technical articles where developers already discuss similar problems.

Instead of posting:

"I built a new Docker tool. Check it out!"

Write something useful:

"Why Docker Keeps Eating Your Disk Space and How to Clean It Safely."

Explain why disk usage grows, show diagnostic commands, compare cleanup approaches, and discuss the trade-offs.

If your project genuinely solves part of the problem, introduce it as one possible solution.

The article provides value even if the reader never opens your repository.

DEV Community is a natural place for technical discussions, but it's far from the only option.

There are independent developer blogs, programming communities, technical publications, and platforms that accept contributions from external authors.

Finding the right ones can be surprisingly time-consuming.

One useful starting point is this directory of websites where you can publish articles. It organizes publishing opportunities across different topics, languages, and formats, making it easier to discover alternatives beyond the platforms you already know.

For an open-source launch, you can use a directory like this to identify relevant communities, review their submission guidelines, and build a shortlist of potential publication channels.

Of course, being listed doesn't guarantee editorial acceptance, free publication, or traffic. Those details still need to be verified directly.

The objective isn't to distribute the same promotional article everywhere.

It's to find communities where the technical problem your project solves is already being discussed.

How to Identify Which Publications Actually Bring Users

Suppose you've published an article on DEV Community, another on your personal blog, and a third on an independent developer website.

A week later, your application receives 300 visits.

Which publication generated them?

Without attribution, you might have to rely on referral data, which isn't always complete.

Browsers, privacy settings, and applications can restrict referrer information.

UTM parameters offer one way to organize campaign attribution.

For example, a link from DEV Community might look like this:

https://example.com/tool?utm_source=devto&utm_medium=article&utm_campaign=launch
Enter fullscreen mode Exit fullscreen mode

For another publishing platform, change the utm_source value.

You can generate these links programmatically using JavaScript:

function campaignUrl(baseUrl, source) {
  const url = new URL(baseUrl);

  url.searchParams.set("utm_source", source);
  url.searchParams.set("utm_medium", "article");
  url.searchParams.set("utm_campaign", "launch");

  return url.toString();
}

const link = campaignUrl(
  "https://example.com/tool",
  "devto"
);

console.log(link);
Enter fullscreen mode Exit fullscreen mode

There's one limitation: UTM parameters don't measure anything by themselves.

Your website or analytics system must capture and process them.

Otherwise, you're simply adding extra query parameters to a URL.

For open-source CLI tools, be careful about introducing usage telemetry. Collecting data without clear disclosure can undermine trust. If telemetry is necessary, document what it collects, minimize the data, and provide appropriate consent and opt-out mechanisms.

Why Technical Articles Can Work Better Than Promotional Posts

Imagine a developer investigating a slow SQL query.

They're not looking for a new product.

They just want to understand why a query takes 12 seconds instead of the expected 200 milliseconds.

During their research, they discover a technical article.

The author explains EXPLAIN ANALYZE, demonstrates query execution plans, compares indexes, and provides reproducible examples.

Near the end, the article introduces a small open-source tool that automates part of the diagnostic process.

Suddenly, the tool becomes relevant.

The reader already has a problem. The article demonstrates a possible solution. The project offers a way to implement it.

This is fundamentally different from posting an advertisement for an unfamiliar utility.

But technical credibility matters.

If you claim your tool makes SQL queries ten times faster, readers should be able to examine the benchmark conditions.

What database version did you use?

How large was the dataset?

What indexes existed?

How many runs were performed?

Without this information, the performance claim is difficult to evaluate or reproduce.

A detailed explanation of trade-offs will often be more useful than an impressive number without context.

A Practical Launch Plan for a Small Open-Source Project

You don't need a marketing department to launch a useful developer tool.

A structured process is enough to start learning from real users.

Step 1: Verify the Core Functionality

Before announcing the project, make sure it actually solves the problem it claims to solve.

Provide a reproducible test scenario, working examples, and documented limitations.

If the tool is intended for self-hosting, test installation in a clean environment rather than relying on your development machine.

Step 2: Prepare Documentation and a Demo

Your README should include the smallest useful working example.

For a visual application, consider screenshots or a live demonstration.

For a library, a short code example with expected output may be more helpful.

Include installation requirements, license information, compatibility notes, and maintenance status.

Users should know whether they're adopting a stable tool, an experimental prototype, or an abandoned project.

Step 3: Publish a Technical Breakdown

Don't rewrite your README as a blog post.

Explain the problem behind the project.

Discuss existing solutions, the reasons they didn't fully meet your needs, and the design decisions you made.

For example:

  • Why did you choose Go instead of Python?
  • What performance limitations did you encounter?
  • Which alternatives did you reject?
  • What would you change if you started over?

These details give readers something substantial to discuss.

Step 4: Collect Real Feedback

After publication, look beyond traffic and stars.

Pay attention to questions such as:

  • Why doesn't installation work on a particular OS version?
  • Does it support ARM?
  • Can I run it without Docker?
  • What happens if the process crashes?
  • Is there a limit on the amount of data it can process?

These questions reveal real-world requirements that may not have appeared during development.

One detailed GitHub issue can provide more actionable information than a hundred stars.

Don't Add Redis Just Because Nobody Uses Your Product

Developers have a familiar response to uncertainty: keep coding.

Not enough users? Add more features.

No feedback? Redesign the interface.

The project isn't growing? Rewrite it using a different framework.

But every additional feature increases testing requirements, maintenance costs, and potential failure points.

If nobody knows your application exists, adding Redis won't solve the discovery problem.

Before another major refactor, ask yourself three questions:

First: How many people have actually discovered the project?

Second: How many tried to use it?

Third: What prevented the others from getting value?

If you can't answer those questions, rewriting the application probably won't help you understand demand.

Sometimes the next useful development task isn't a code change.

It's improving the documentation, fixing onboarding, writing a technical tutorial, or showing the project to people who experience the problem it addresses.

Your First 10 Users Might Be More Valuable Than 1,000 GitHub Stars

Imagine ten developers install your tool and start using it in real projects.

One discovers a bug.

Another proposes a feature.

A third submits a pull request.

Someone else explains why the tool doesn't work in their infrastructure.

You now have concrete information that can guide development.

Compare that with a repository collecting 1,000 stars after a popular social media post, but generating no issues, contributions, or observable usage.

The second project has more visible attention.

The first has stronger evidence of real-world engagement.

Stars still have value as a discovery and bookmarking signal. They simply measure something different from successful product usage.

GitHub makes your code available. Users tell you whether your software actually solves a problem.

So after your next git push, consider spending an evening on something other than another feature.

Write a technical article explaining the problem your project addresses. Include a reproducible example, describe its limitations, and publish it where developers already discuss that problem.

Then measure something more meaningful than likes.

Did at least one new user successfully solve a real problem with your software?

If the answer is yes, you've learned something that another thousand lines of code might never have revealed.

Top comments (0)