Micro-SaaS & Side Project Ideas Finder 🚀 avatar

Micro-SaaS & Side Project Ideas Finder 🚀

Pricing

from $1.00 / 1,000 launch founds

Go to Apify Store
Micro-SaaS & Side Project Ideas Finder 🚀

Micro-SaaS & Side Project Ideas Finder 🚀

Find side project ideas and micro-SaaS opportunities from Hacker News Show HN, ranked by momentum - points gained per hour - so you see what is gaining traction now. Includes upvotes, comments, velocity and an engagement tier. No API key needed.

Pricing

from $1.00 / 1,000 launch founds

Rating

0.0

(0)

Developer

Joe Y

Joe Y

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

3 hours ago

Last modified

Share

Micro-SaaS & Side Project Ideas Finder

Find side project ideas and micro-SaaS opportunities, ranked by how fast they are climbing right now.

This Actor scans Hacker News Show HN, keeps the launches that point at an actual product, demo or repository, and ranks them by momentum — points gained per hour — so the table leads with projects that are taking off today rather than ones that slowly accumulated a big total months ago. Every row also carries the lifetime totals, the comment velocity, and a debate-versus-approval ratio, so you can re-rank it any way you need.

No API key, no credentials, no setup. Show HN is read through Algolia's public Hacker News Search API.

Why Show HN

Show HN is where makers post their projects, and by convention every submission links to something real that you can open and try. That makes it a much better source for launch discovery than a general discussion forum:

  • Every post is a launch, not a question or an opinion piece.
  • Each one carries points and comment counts, so engagement is directly comparable.
  • The archive goes back over a decade, with roughly 1.95 million launches indexed.
  • No authentication, so the Actor runs immediately and never breaks on expiring tokens.

Input

FieldTypeDefaultDescription
timeFilterstringmonthHow far back to look, based on submission date: day, week, month, year or all. Longer windows make any given row count more selective — see the window matters.
maxPostsinteger100Maximum number of matching launches to return (10–200). If fewer match, you get all of them. See How many results you get.
sortBystringvelocityRanking field: velocity (points per hour), engagement (lifetime upvotes + comments), comments (lifetime comment count) or newest. See Choosing a sort.
onlyWithExternalUrlbooleantrueKeep only launches that link off Hacker News. Drops text-only threads and self-links back to news.ycombinator.com, so projectUrl always points at a real destination.

Output

Each run fills the default dataset with one row per launch, sorted by engagementScore descending.

FieldTypeDescription
titlestringTitle of the post, including its Show HN: prefix.
projectUrlstringWhere the launch points: the product, demo, landing page or repository. Empty for text-only posts if you disable the filter.
projectDomainstringHostname of projectUrl, useful for grouping posts about the same product.
postPermalinkstringPermanent link to the original Hacker News discussion.
authorstringHacker News username of the poster.
upvotesintegerHacker News points at the time of the run.
numCommentsintegerNumber of comments on the post.
engagementScoreintegerupvotes + (comments × 2). Lifetime engagement. Nearly redundant with upvotes (ρ = 0.96), so prefer pointsPerHour for ranking.
hoursOldnumberHow many hours before the run the post was submitted. 0 if no timestamp was available.
pointsPerHournumberUpvotes ÷ age in hours. The default ranking field.
commentsPerHournumberComments ÷ age in hours.
discussionRationumberComments ÷ upvotes. High values mean a launch provoked debate rather than passive approval. 0 when a post has no upvotes.
engagementTierstringVelocity label from pointsPerHour: viral (≥3), hot (≥1), rising (≥0.25), steady (below 0.25).
createdAtstringISO 8601 UTC timestamp of when the post was submitted.

Choosing a sort

The sortBy input picks the ranking field. Measured across 300 real Show HN launches, these options are not interchangeable — Spearman rank correlation:

sortcorrelated with engagement bymedian age of its top 8
velocity0.7331 hours
engagement1.00468 hours (~3 weeks)
newest——

velocity (default) surfaces what is climbing now. Because every rate is divided by age, it can rank a 145-point launch from this morning above a 554-point launch from last week — which is usually what you want when hunting for emerging projects. Its top ranks are not noise: the top 8 all had 85+ points.

engagement re-ranks by lifetime totals, giving you the proven winners. Be aware that this is almost identical to sorting by raw upvotes: across 300 launches, engagementScore correlates with upvotes at 0.96, so the comment weighting barely changes the order. If you want a genuinely different second view, use velocity.

comments ranks by lifetime comment count, useful for finding launches that sparked discussion rather than quiet approval.

newest is pure recency, for monitoring rather than ranking.

discussionRatio is deliberately not a sort option. It is uncorrelated with traction (ρ = 0.05 against velocity), and its top ranks are dead posts with many comments and almost no upvotes — a median of just 15 points. It is useful as a flag on good rows, never as a ranking.

How the sort interacts with maxPosts

The Actor collects the top maxPosts launches by points first, then ranks that set by sortBy. So sortBy reorders the results; it does not change which launches are fetched. maxPosts therefore acts as both a result cap and an evidence floor.

This is deliberate. Ranking every recent submission by velocity would surface noise — measuring the full past week by date turns up posts like 2 points at 30 minutes old, which computes to 4 points/hour and outranks a genuine 209-point launch. Requiring a launch to earn its place on total points first filters those out.

The practical consequence: a brand-new launch with very few points will not appear, no matter how steep its early curve. That is intentional — a 6-point post two hours old is not a lead, and the tier logic refuses to label it one. If you genuinely want to catch launches at that stage you would need to rank by date rather than points, which trades away the quality filtering entirely.

Engagement tiers

engagementTier labels each launch by velocity, so you can filter the dataset to just the fast movers. The thresholds are a heuristic, not a published Hacker News standard. They were calibrated against 300 real Show HN launches, where points-per-hour has a median of 0.13 and a maximum near 16 — so a "fast" launch moves only a few points per hour. At the default maxPosts of 100 this puts roughly 12% of launches in viral, 15% in hot and 30–50% in rising.

Because rates fall as posts age, an all time run is legitimately mostly steady: an old post is historically significant, not currently trending. Use a recent timeFilter if you want the tier to discriminate.

A launch needs at least 10 points before it can be labelled anything but steady. Rate metrics are meaningless on tiny numerators: a post submitted two hours ago with 6 points computes to 3 points/hour and would otherwise be called viral, which the evidence does not support. The floor matters most when a query reaches deep into low-scoring submissions; at the default month window with 100 rows the lowest-scoring row has 62 points, so it rarely binds.

The thresholds are defined as ENGAGEMENT_TIERS and the floor as MIN_POINTS_FOR_TIER in the source if you want to reinterpret them.

Example output

{
"title": "Show HN: An e-ink frame that hears birds and draws them",
"projectUrl": "https://github.com/arnegiacomo/fugleramme",
"projectDomain": "github.com",
"postPermalink": "https://news.ycombinator.com/item?id=42380493",
"author": "arnegiacomo",
"upvotes": 2391,
"numComments": 267,
"engagementScore": 2925,
"hoursOld": 155.4,
"pointsPerHour": 15.39,
"commentsPerHour": 1.72,
"discussionRatio": 0.112,
"engagementTier": "rising",
"createdAt": "2024-12-11T08:41:07+00:00"
}

How many results you get

If fewer launches match than you asked for, you get all of them. Measured against an independent count of the source data:

timeFilterMatching launches that existmaxPostsReturned
day155200155
week951200200
month984200200

Hacker News' search index exposes at most 1000 results per query, so no run can ever return more than that — an all time run reaches 1000 of the 1.95 million Show HN posts that exist.

maxPosts is a quality dial, not just a quantity dial

Results arrive from the API already ranked by points, highest first. maxPosts is where you stop reading down that list, so every extra row is lower-scoring than the last:

position11050100200400975
points2391392116621663

The same 975-item list, cut in three places:

maxPostsRowsPoints range
1001002391 → 62
5005002391 → 5
10009752391 → 3

So asking for 1000 does not get you 10× the value of 100 — it gets you the same top 100 plus 900 rows of noise.

The window matters as much as the row count

Drawing from a longer window makes any given row count more selective:

rowsweek windowmonth window
5016 pts116 pts
1006 pts62 pts
2004 pts16 pts
3003 pts9 pts

Note that week + 100 rows is worse than month + 100 rows — a week simply doesn't hold enough submissions for the top 100 to be selective.

The defaults are tuned for this: timeFilter: month with maxPosts: 100 gives a 62-point floor, so every row is a launch that earned real attention. maxPosts is capped at 200, which is roughly where the month-window floor drops to 16 points.

Raise maxPosts only if you want breadth and intend to filter the results yourself.

How it works

  1. Queries the Show HN search API, translating timeFilter into a submission-date cutoff and requesting results best-first.
  2. Pages through the results until maxPosts matches are collected, honouring the external-URL filter.
  3. Computes engagementScore for every post, plus age-normalised velocity metrics that distinguish a fast-rising launch from one that accumulated the same total slowly.
  4. Sorts the whole result set once by the field you chose in sortBy, then writes it to the dataset.

Because it uses a lightweight JSON API rather than a headless browser, a run finishes in seconds and stays cheap. A polite pause between pages keeps the Actor well inside the API's rate limits. If the run is stopped early, everything collected so far is still saved to the dataset.

Cost

The Actor never launches a browser, and the default run makes only one or two HTTP requests. Memory and CPU use are minimal, so you pay for just the few seconds of Apify compute the run actually uses.

Troubleshooting

The run finished with 0 results — every post was filtered out. Try timeFilter: all, a larger maxPosts, or turn off onlyWithExternalUrl to include text-only threads.

Fewer results than maxPosts — the time filter or the external-URL filter removed more posts than were available in the listing. Widen the time filter or raise maxPosts.

This Actor reads Hacker News data through Algolia's public HN Search API. Usernames are included in the output so you can identify who launched a project; treat the data accordingly and respect the API's rate limits, which this Actor enforces by pausing between requests.