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):
- Homepage SEO
<title>/og:titlenow leads with “TypeScript Backend Framework” instead of “Home” (docs/index.mdfront-matter; home excluded from sidebar nav since the header logo links home).OrganizationJSON-LD added to the homepage (head_custom.html).og.pngverified at 1200×630.- GitHub repo topics extended to 20 (added
orm,realtime,self-hosted,api-framework);streetjsnpm package and repo About already point to the docs site.- 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: /streetis correct for a project page and is handled properly byjekyll-seo-tagandjekyll-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/baseurlmust 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-docsusespage.titlefor 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 inhead_custom.html(emit a<title>andog:titleof “StreetJS — Batteries-Included TypeScript Backend Framework” onpage.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:
- Own your brand. Rank #1 for “StreetJS”, “@streetjs”, “streetjs framework”. Easy, fast, foundational.
- Win comparison intent. “NestJS alternative”, “StreetJS vs Fastify” — lower competition, high purchase intent.
- Capture specific capability searches. “TypeScript backend with native PostgreSQL”, “Node.js framework without Express”, “dependency-light backend framework”.
- Build topical authority via tutorials. HowTo content that answers “build X with StreetJS” earns long-tail traffic and internal-link equity.
- 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-Xslug convention for consistency. The brief suggested/compare/nestjs/etc.; the existingstreetjs-vs-nestjsslug 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:
- One-line summary (“In one line: …”).
- At-a-glance feature table (honest, including where the competitor wins).
- When to choose each.
- Migration path (link to the relevant
migration-from-*guide where one exists). - Keyword-rich title + meta containing both product names.
- 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.
9. Backlink Acquisition Strategy
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.jsonhomepagepoints to the docs site (npm passes a link). Effort: trivial. - GitHub topics: add
typescript,backend-framework,nodejs,postgresql,websockets,ormtopics 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_verificationis 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
- Add property:
https://hassanmubiru.github.io/StreetJS/(URL-prefix property — a project subpath can’t use a Domain property). - Verify via the HTML tag method → copy the
content="..."token → paste intogoogle_site_verification:in_config.yml(jekyll-seo-tagthen emits the meta tag). Commit + let Pages rebuild → click Verify. - Submit the sitemap:
https://hassanmubiru.github.io/StreetJS/sitemap.xml. - Use URL Inspection on the homepage,
/getting-started/, and each comparison page → Request Indexing.
Bing Webmaster Tools
- Add the same URL-prefix site.
- Import from Google Search Console (fastest) or verify via meta tag.
- 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 |
180-Day Plan — Tutorial authority & backlinks
| 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
- Verify Search Console + submit sitemap (you currently can’t measure anything).
- Fix the homepage SEO title (highest on-page leverage; currently wasted on “Home”).
- Ship the 5 missing comparison pages (highest-intent, lowest-competition keywords).
- Ship the 4 capability landing pages (own your category phrases).
- Backlinks from awesome-lists + npm/GitHub metadata (durable authority).
- Add
Organization/HowTo/TechArticleschema (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.