Phase 13 · Discoverability

Search Ranking Strategy

An evidence-based technical SEO audit and a realistic 12-month plan to make StreetJS discoverable through organic search — without a custom domain.

Status legend. Every finding below is tagged: VERIFIED (checked against the live site or repo on 2026-06-16), GAP (confirmed missing), PARTIAL (exists but incomplete), IMPLEMENTED (fixed as part of this program), or RECOMMENDATION (proposed action, not yet implemented). Traffic numbers are estimates, not measurements — StreetJS has little search history yet, so treat ranking timelines as directional.

Implemented in this pass (IMPLEMENTED):

  1. Homepage SEO <title>/og:title now leads with “TypeScript Backend Framework” instead of “Home” (docs/index.md front-matter; home excluded from sidebar nav since the header logo links home).
  2. Organization JSON-LD added to the homepage (head_custom.html).
  3. og.png verified at 1200×630.
  4. GitHub repo topics extended to 20 (added orm, realtime, self-hosted, api-framework); streetjs npm package and repo About already point to the docs site.
  5. Shipped the 5 missing comparison pages: Spring Boot, ASP.NET Core, Auth0, Firebase, Pusher.

Still requires the maintainer (cannot be done from the repo alone): Search Console verification — paste the verification token into google_site_verification: in _config.yml (see §10).


1. Technical SEO Audit

1.1 What is already correct (VERIFIED)

Item Status Evidence
robots.txt VERIFIED HTTP 200, User-agent: * / Allow: /, references the sitemap
sitemap.xml VERIFIED HTTP 200, 132 <loc> entries (auto-generated by jekyll-sitemap)
feed.xml (RSS) VERIFIED HTTP 200 (auto-generated by jekyll-feed)
Canonical URLs VERIFIED <link rel="canonical"> present on home (jekyll-seo-tag)
Meta description VERIFIED Present and keyword-relevant on home
Twitter card VERIFIED summary_large_image
Open Graph PARTIAL og:* present, but og:title is the literal word “Home”
JSON-LD: SoftwareApplication VERIFIED Homepage only (head_custom.html)
JSON-LD: FAQPage VERIFIED /faq/ only
JSON-LD: BreadcrumbList VERIFIED Nested pages with a parent
JSON-LD: APIReference VERIFIED api-reference page
HTTPS + clean URLs VERIFIED GitHub Pages serves HTTPS; pretty permalinks in use

The foundation is genuinely strong. The losses are in on-page targeting and content coverage, not infrastructure.

1.2 Issues to fix (ranked by impact)

# Issue Severity Status
1 Homepage <title> / og:title was “Home | StreetJS” — now leads with the primary keyword High IMPLEMENTED
2 No keyword-targeted landing pages (e.g. “TypeScript backend framework”) High GAP
3 google_site_verification is empty in _config.yml → site not in Search Console → zero query visibility High GAP
4 Comparison set incomplete (no Spring, ASP.NET, Auth0, Pusher, Firebase) Medium GAP
5 No TechArticle / HowTo / Organization structured data Medium GAP
6 Many high-value report pages (STREETJS-FULL-REPORT, certification docs) are indexable but have no SEO intent and dilute crawl focus Low PARTIAL
7 og:image (/assets/images/og.png) confirmed 1200×630 VERIFIED

1.3 Jekyll configuration review

  • baseurl: /street is correct for a project page and is handled properly by jekyll-seo-tag and jekyll-sitemap (verified: sitemap URLs include /street/). No action needed while you stay on GitHub Pages.
  • Permalinks are clean and human-readable. Keep the permalink: field on every new page so URLs stay stable (URL churn destroys accumulated ranking).
  • url / baseurl must never change without 301 planning — GitHub Pages can’t issue server-side 301s, so a move requires a custom domain + redirects.

RECOMMENDATION — homepage title. just-the-docs uses page.title for the sidebar nav label, so renaming the home page to a long keyword string would break the nav. The safe fix is to override only the SEO title in head_custom.html (emit a <title> and og:title of “StreetJS — Batteries-Included TypeScript Backend Framework” on page.url == "/") while leaving the nav label as “Home”. This is the single highest-leverage on-page change.


2. Search Ranking Strategy (overview)

StreetJS is a new entrant against entrenched incumbents (Express, Fastify, NestJS, Laravel, Django, Spring, ASP.NET). Ranking for head terms like “backend framework” is unrealistic for 12–24 months. The winning strategy is long-tail and comparison-led:

  1. Own your brand. Rank #1 for “StreetJS”, “@streetjs”, “streetjs framework”. Easy, fast, foundational.
  2. Win comparison intent. “NestJS alternative”, “StreetJS vs Fastify” — lower competition, high purchase intent.
  3. Capture specific capability searches. “TypeScript backend with native PostgreSQL”, “Node.js framework without Express”, “dependency-light backend framework”.
  4. Build topical authority via tutorials. HowTo content that answers “build X with StreetJS” earns long-tail traffic and internal-link equity.
  5. Earn backlinks from developer communities and “awesome” lists to lift domain authority over time.

3. Keyword Strategy

Difficulty is a 1–5 estimate (5 = hardest). Value is strategic, not just volume.

3.1 High priority (realistic in 6–12 months)

Keyword Difficulty Value Target page
streetjs / streetjs framework 1 Brand /
nestjs alternative 3 High /compare/streetjs-vs-nestjs/
fastify alternative 3 High /compare/streetjs-vs-fastify/
express alternative typescript 3 High /compare/streetjs-vs-express/
typescript backend framework 4 High /typescript-backend-framework/ (new)
node.js backend without express 2 Medium /nodejs-backend-framework/ (new)
dependency-light backend framework 2 Medium /dependency-light-framework/ (new)
native postgresql node.js (no pg) 2 Medium /database/ + tutorial

3.2 Medium priority (achievable with content growth)

Keyword Difficulty Value
typescript api framework 4 High
self-hosted backend framework 3 Medium
backend framework with authentication 4 Medium
backend framework with realtime / websockets 3 Medium
backend framework with built-in orm 4 Medium
full-stack typescript framework 4 Medium
auth0 alternative self-hosted 4 Medium
pusher alternative websockets 3 Medium

3.3 Long-term (high authority required)

Keyword Difficulty Notes
backend framework 5 Dominated by incumbents; pursue only after DA grows
node.js framework 5 Same
typescript framework 5 Same
best backend framework 2026 5 Listicle-dominated; pursue via guest posts

4. Content Gap Analysis

4.1 Comparison pages

VERIFIED present: streetjs-vs-{nestjs, fastify, express, laravel, django} under /compare/.

Page Status Priority
/compare/streetjs-vs-nestjs/ VERIFIED
/compare/streetjs-vs-fastify/ VERIFIED
/compare/streetjs-vs-express/ VERIFIED
/compare/streetjs-vs-laravel/ VERIFIED
/compare/streetjs-vs-django/ VERIFIED
/compare/streetjs-vs-spring/ IMPLEMENTED
/compare/streetjs-vs-aspnet/ IMPLEMENTED
/compare/streetjs-vs-auth0/ IMPLEMENTED
/compare/streetjs-vs-pusher/ IMPLEMENTED
/compare/streetjs-vs-firebase/ IMPLEMENTED

Keep the existing streetjs-vs-X slug convention for consistency. The brief suggested /compare/nestjs/ etc.; the existing streetjs-vs-nestjs slug is actually better for SEO because it contains both brand names. Do not rename existing pages (URL churn).

4.2 Keyword landing pages (all GAP)

These target capability/category searches that current docs don’t cleanly own:

  • /typescript-backend-framework/
  • /nodejs-backend-framework/
  • /typescript-api-framework/
  • /dependency-light-framework/

Each should be a focused 600–1,200-word page: one H1 matching the keyword, a clear value prop, a code sample, a feature table, and internal links to docs + the most relevant comparison page.

4.3 Cost / self-hosting

  • /deployment/budget/ — VERIFIED (already published this program).
  • /compare/streetjs-vs-auth0/, .../pusher/, .../firebase/ — GAP (see 4.1).

5. Tutorial SEO Plan

VERIFIED present: first-api, auth, postgresql, realtime, fullstack-react under /tutorials/.

Each new tutorial below should ship with the front-matter shown and a HowTo JSON-LD block (see §7).

Beginner

Tutorial Status Target keyword Intent Suggested title Meta description
Build a REST API VERIFIED (first-api) “build rest api typescript” How-to “Build a REST API with StreetJS (TypeScript)” “Step-by-step: build a typed REST API with routing, validation, and PostgreSQL using StreetJS — no Express required.”
Build Authentication VERIFIED (auth) “typescript jwt authentication tutorial” How-to “Build JWT Authentication with StreetJS” “Add JWT auth, sessions, and route guards to a TypeScript backend with StreetJS built-in security primitives.”
Build a Todo App GAP “typescript backend todo app” How-to “Build a Todo App with StreetJS” “Your first full CRUD backend: routes, ORM models, and PostgreSQL persistence with StreetJS in under 30 minutes.”

Intermediate

Tutorial Status Target keyword Intent Suggested title
Build a SaaS Backend GAP “typescript saas backend” How-to “Build a SaaS Backend with StreetJS”
Build Realtime Chat VERIFIED (realtime) “typescript websocket chat tutorial” How-to “Build Realtime Chat with StreetJS WebSockets”
Build Multi-Tenant Apps GAP “multi-tenant backend typescript” How-to “Build Multi-Tenant Applications with StreetJS”

Advanced

Tutorial Status Target keyword Intent
Build AI Agents GAP “typescript ai agent backend” How-to
Build RAG Applications GAP “typescript rag application backend” How-to
Scale WebSockets GAP “scale websockets node.js” How-to
Secure Enterprise APIs GAP “secure enterprise api typescript” How-to

Internal-link rule for every tutorial: link up to its category index (/tutorials/), across to the most relevant doc section, and out to one comparison page. This distributes link equity and keeps everything within 3 clicks.


6. Comparison Page Strategy

Each comparison page should follow the existing, fairness-first template and include:

  1. One-line summary (“In one line: …”).
  2. At-a-glance feature table (honest, including where the competitor wins).
  3. When to choose each.
  4. Migration path (link to the relevant migration-from-* guide where one exists).
  5. Keyword-rich title + meta containing both product names.
  6. Internal links to: /compare/ index, the matching capability landing page, and /getting-started/.

Priority order for the 5 missing pages: Auth0 → Firebase → Pusher → Spring → ASP.NET (the first three map directly to StreetJS’s strongest differentiators: self-hosted auth, full-stack, and native realtime).


7. Structured Data Strategy

Schema Where Status Action
SoftwareApplication Homepage VERIFIED Keep; confirm softwareVersion stays current
FAQPage /faq/ VERIFIED Keep; expand with comparison questions
BreadcrumbList Nested pages VERIFIED Keep
APIReference api-reference VERIFIED Keep
Organization Site-wide (home) IMPLEMENTED Added this pass — establishes the brand entity
TechArticle Docs pages GAP Add for long-form guides
HowTo Tutorials GAP Add per tutorial (steps map to headings)

Organization (add to head_custom.html, homepage):

1
2
3
4
5
6
7
8
9
10
11
{
  "@context": "https://schema.org",
  "@type": "Organization",
  "name": "StreetJS",
  "url": "https://hassanmubiru.github.io/StreetJS/",
  "logo": "https://hassanmubiru.github.io/StreetJS/assets/images/logo.svg",
  "sameAs": [
    "https://github.com/hassanmubiru/StreetJS",
    "https://www.npmjs.com/package/streetjs"
  ]
}

HowTo (per tutorial — emit when page.layout/a howto: true flag is set):

1
2
3
4
5
6
7
8
9
10
11
{
  "@context": "https://schema.org",
  "@type": "HowTo",
  "name": "Build a REST API with StreetJS",
  "description": "Step-by-step guide to building a typed REST API with StreetJS.",
  "step": [
    { "@type": "HowToStep", "name": "Install the CLI", "text": "npm install -g @streetjs/cli" },
    { "@type": "HowToStep", "name": "Create the project", "text": "street create my-api" },
    { "@type": "HowToStep", "name": "Define a route", "text": "Add a controller with @Get()." }
  ]
}

TechArticle should set headline, description, datePublished, dateModified, author (Organization), and proficiencyLevel.


8. Internal Linking Plan

Goal: every important page reachable within 3 clicks of the homepage, with topical hubs that concentrate link equity.

1
2
3
4
5
6
7
8
9
10
11
Home (/)
├── Get Started ── Getting Started ── {installation, first-server, structure, config}
├── Documentation ── {core, database, auth, realtime, jobs, storage, security, observability}
├── Tutorials (hub) ── {beginner, intermediate, advanced tutorials}
├── Examples (hub) ── {saas, chat, e-commerce, dating, ai}
├── Plugins ── {official, verified, community}
├── Compare (hub) ── {nestjs, fastify, express, laravel, django, +spring/aspnet/auth0/pusher/firebase}
├── Capability landing pages ── {typescript-backend-framework, nodejs-backend-framework, ...}
├── Enterprise ── {security, compliance, console}
├── Adoption ── {roadmap, scorecard, go-to-market}
└── Community ── {contributing, RFC, governance}

Hub-and-spoke rules:

  • Homepage links to all top-level hubs (it already does via the landing sections).
  • Each capability landing page links to the matching comparison page and 1–2 tutorials.
  • Each tutorial links back to its hub and to one doc section and one comparison page.
  • Comparison pages cross-link to each other via the /compare/ index.

Orphan risk (VERIFIED concern): the many root-level *-CERTIFICATION.md, STREETJS-*.md, and program reports are in the sitemap but weakly linked from nav. Either (a) group them under a “Reports & Certification” nav parent, or (b) add nav_exclude: true + keep them linked from one index page so they don’t dilute crawl focus. Recommended: option (a) for the certification docs (they build trust), (b) for internal program reports.


Realistic, white-hat, ordered by effort-to-impact.

Quick wins (week 1–4)

  • “Awesome” lists (PRs): Awesome Node.js, Awesome TypeScript, Awesome Self-Hosted. High-authority, durable backlinks. Effort: low.
  • npm + GitHub: ensure the GitHub repo “About” links the docs site; ensure package.json homepage points to the docs site (npm passes a link). Effort: trivial.
  • GitHub topics: add typescript, backend-framework, nodejs, postgresql, websockets, orm topics for GitHub’s own discovery.

Content-led (month 1–6)

Publish cross-posted articles (canonical on the docs blog, syndicated to DEV.to / Hashnode / Medium with rel=canonical pointing home):

Article Angle Best channel
Introducing StreetJS Launch / story DEV.to, Hashnode
Why StreetJS Exists Philosophy, dependency-light DEV.to, Medium
StreetJS vs NestJS Comparison (high intent) DEV.to, Reddit r/node
Building a Dependency-Light Framework Engineering deep-dive Hacker News (Show HN), Lobsters
Native PostgreSQL Without pg Technical novelty Hacker News, r/PostgreSQL

Community (ongoing)

  • Answer relevant Stack Overflow / Reddit questions with genuine help + a link where appropriate (no spam).
  • “Show HN” for the launch and for the native-PG-driver deep-dive (highest backlink potential if it lands).

Estimated impact (directional, not guaranteed): awesome-list + npm/GitHub links can lift brand and category long-tail within 1–3 months. A single front-page Hacker News hit can do more for awareness than months of incremental SEO — but it’s unpredictable. Plan for steady compounding, treat virality as upside.


10. Search Console Setup Guide

Blocker (GAP): google_site_verification is empty in _config.yml, so the site is almost certainly not yet verified in Google Search Console. This is the #1 prerequisite — without it you’re flying blind on impressions/clicks/queries.

Google Search Console

  1. Add property: https://hassanmubiru.github.io/StreetJS/ (URL-prefix property — a project subpath can’t use a Domain property).
  2. Verify via the HTML tag method → copy the content="..." token → paste into google_site_verification: in _config.yml (jekyll-seo-tag then emits the meta tag). Commit + let Pages rebuild → click Verify.
  3. Submit the sitemap: https://hassanmubiru.github.io/StreetJS/sitemap.xml.
  4. Use URL Inspection on the homepage, /getting-started/, and each comparison page → Request Indexing.

Bing Webmaster Tools

  1. Add the same URL-prefix site.
  2. Import from Google Search Console (fastest) or verify via meta tag.
  3. Submit the same sitemap.

Monitoring (review weekly → monthly)

  • Impressions — are pages being shown? (coverage signal)
  • Clicks — actual visits from search.
  • CTR — clicks ÷ impressions; low CTR with high impressions = weak title/description → rewrite them.
  • Average position — ranking trend per query; focus on terms sitting at positions 5–15 (page-1 reach is achievable with small on-page improvements).

11. 12-Month SEO Roadmap

30-Day Plan — Foundation & instrumentation

| Task | Priority | Expected impact | Effort | |—|—|—|—| | Verify Google + Bing Search Console; submit sitemap | Critical | Unlocks all measurement | Low | | Fix homepage SEO <title>/og:title (keyword, not “Home”) | Critical | Better home ranking + CTR | Low | | Set package.json homepage + GitHub repo About/topics → docs site | High | Backlinks + discovery | Low | | Submit to Awesome Node.js / TypeScript / Self-Hosted | High | Durable authority links | Low | | Add Organization JSON-LD | Medium | Brand entity in SERPs | Low | | Confirm og.png exists at 1200×630 | Medium | Social CTR | Low |

90-Day Plan — Comparison & capability coverage

| Task | Priority | Expected impact | Effort | |—|—|—|—| | Ship 5 missing comparison pages (Auth0, Firebase, Pusher, Spring, ASP.NET) | High | High-intent long-tail | Medium | | Ship 4 capability landing pages | High | Category long-tail | Medium | | Add HowTo schema to existing tutorials | Medium | Rich results eligibility | Low | | Publish “Introducing StreetJS” + “Why StreetJS Exists” (syndicated) | Medium | Backlinks + awareness | Medium | | Group certification/report pages under nav parents; exclude internal reports | Medium | Crawl focus | Low |

| Task | Priority | Expected impact | Effort | |—|—|—|—| | Ship Todo, SaaS, Multi-Tenant tutorials | High | Long-tail how-to traffic | High | | Publish “StreetJS vs NestJS” + native-PG deep-dive (Show HN / Lobsters) | High | Backlink spikes + awareness | Medium | | Add TechArticle schema to top doc guides | Medium | Article rich results | Low | | First Search Console review: rewrite low-CTR titles/descriptions | High | CTR gains on existing rankings | Low |

365-Day Plan — Compounding & pursuit of head terms

| Task | Priority | Expected impact | Effort | |—|—|—|—| | Ship advanced tutorials (AI agents, RAG, scale WebSockets, enterprise security) | Medium | Differentiated long-tail | High | | Sustained guest posting / community answers | Medium | Authority growth | Ongoing | | Re-target medium-difficulty head terms now that DA has grown | Medium | Category rankings | Ongoing | | Quarterly content refresh (update dates, stats, versions) | Medium | Freshness signal | Low |


12. Deliverables Summary

# Deliverable Where
1 Technical SEO audit §1
2 Search ranking strategy §2
3 Keyword strategy §3
4 Content gap analysis §4
5 Tutorial SEO plan §5
6 Comparison page strategy §6
7 Structured data strategy §7
8 Internal linking plan §8
9 Backlink strategy §9
10 Search Console setup guide §10
11 12-month roadmap §11

Priority fixes ranked by impact

  1. Verify Search Console + submit sitemap (you currently can’t measure anything).
  2. Fix the homepage SEO title (highest on-page leverage; currently wasted on “Home”).
  3. Ship the 5 missing comparison pages (highest-intent, lowest-competition keywords).
  4. Ship the 4 capability landing pages (own your category phrases).
  5. Backlinks from awesome-lists + npm/GitHub metadata (durable authority).
  6. Add Organization / HowTo / TechArticle schema (rich-result eligibility).

Reality check. StreetJS will not out-rank Express or NestJS for head terms in year one, and it shouldn’t try. The compounding wins are brand + comparison + capability long-tail, measured honestly in Search Console. Everything in this plan is achievable on GitHub Pages with no custom domain.