chore: rename references to open-rank back to open-seo (#35)

* docs: move project docs into docs directory

* docs: rebrand landing site as OpenSEO

* fix: update remaining OpenSEO backlinks links

* Change landing page copy + format

* website: add www custom domain route

* Tweak README

* save
This commit is contained in:
Ben Senescu 2026-03-16 18:58:44 -04:00 committed by GitHub
parent a51112d877
commit 23fb595755
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
16 changed files with 97 additions and 97 deletions

View File

@ -91,21 +91,16 @@ printf '%s' 'YOUR_LOGIN:YOUR_PASSWORD' | base64
OpenSEO supports two self-hosting paths:
- Docker for your homelab or local use.
- Docker for your homelab or local use (Recommended).
- Cloudflare for use across multiple devices or for your team.
If you already have Docker installed (or are willing to install it), that is the quickest way to test OpenSEO.
_Docker_
Use this quick guide:
Docker is recommended for getting started. It's super easy to get up and running once you install Docker.
- Choose Docker when:
- You already have Docker installed and want to get set up quickly.
- You have a homelab setup.
- You only want to use OpenSEO locally on one device.
- Choose Cloudflare when:
- You want a more SaaS like experience.
- You want to use it from multiple devices or with teammates.
- You want support for more powerful future features, such as sharing public links to reports or running site audits that render your website's JavaScript.
_Cloudflare_
If you love OpenSEO and want to use it across multiple devices or with your team, you can host it on Cloudflare which we'll be a SaaS-like experience. Also, this will have automatic database backups and other nice convenience features. It's just a bit more effort to get started if you're unfamiliar with Cloudflare.
## Docker Self Hosting
@ -120,8 +115,6 @@ Quickstart:
3. `docker compose up -d`
4. Open `http://localhost:<PORT>` (default `3001`)
Docker Compose passes `.env` values into the container, and the Docker self-host flow enables `CLOUDFLARE_INCLUDE_PROCESS_ENV=true` so the Cloudflare Vite runtime can read them as Worker bindings.
By default, `compose.yaml` pulls the published image from GHCR:
- `ghcr.io/every-app/open-seo:latest`

View File

@ -225,11 +225,11 @@ function InlineMailingListLink() {
return (
<a
className="underline underline-offset-2 hover:text-base-content/70"
href="https://openrank.io"
href="https://openseo.so"
target="_blank"
rel="noreferrer"
>
join the openrank.io mailing list
join the OpenSEO mailing list
</a>
);
}

View File

@ -1 +1 @@
web/open-rank
web/open-seo

View File

@ -1,5 +1,5 @@
{
"name": "open-rank-landing",
"name": "open-seo-landing",
"private": true,
"type": "module",
"sideEffects": false,

View File

@ -1,4 +1,4 @@
# https://www.robotstxt.org/robotstxt.html
User-agent: *
Disallow:
Sitemap: https://openrank.io/sitemap.xml
Sitemap: https://openseo.so/sitemap.xml

View File

@ -9,7 +9,7 @@ const __dirname = dirname(__filename);
const DIST_DIR = join(__dirname, "../dist/client");
const DEFAULT_SITE_URL = "https://openrank.io";
const DEFAULT_SITE_URL = "https://openseo.so";
const SITE_URL = (process.env.SITE_URL ?? DEFAULT_SITE_URL).replace(/\/+$/, "");
const STATIC_PATHS = new Set(["/", "/privacy"]);

View File

@ -3,7 +3,7 @@ import type { BaseLayoutProps } from "fumadocs-ui/layouts/shared";
export function baseOptions(): BaseLayoutProps {
return {
nav: {
title: <span className="font-semibold">OpenRank</span>,
title: <span className="font-semibold">OpenSEO</span>,
},
links: [
{

View File

@ -1,4 +1,4 @@
const DEFAULT_SITE_URL = "https://openrank.io";
const DEFAULT_SITE_URL = "https://openseo.so";
export const SITE_URL = (
process.env.SITE_URL ??

View File

@ -43,7 +43,7 @@ function RootDocument({ children }: { children: React.ReactNode }) {
<script
dangerouslySetInnerHTML={{
__html:
"(function(){function loadAnalytics(){if(window.__openrankAnalyticsLoaded)return;window.__openrankAnalyticsLoaded=true;window.plausible=window.plausible||function(){(plausible.q=plausible.q||[]).push(arguments)};plausible.init=plausible.init||function(i){plausible.o=i||{}};plausible.init({endpoint:'/api/event'});var script=document.createElement('script');script.defer=true;script.src='/js/script.js';document.head.appendChild(script)}function schedule(){if('requestIdleCallback'in window){window.requestIdleCallback(loadAnalytics,{timeout:2000});return}window.setTimeout(loadAnalytics,2000)}if(document.readyState==='complete'){schedule();return}window.addEventListener('load',schedule,{once:true})})();",
"(function(){function loadAnalytics(){if(window.__openSeoAnalyticsLoaded)return;window.__openSeoAnalyticsLoaded=true;window.plausible=window.plausible||function(){(plausible.q=plausible.q||[]).push(arguments)};plausible.init=plausible.init||function(i){plausible.o=i||{}};plausible.init({endpoint:'/api/event'});var script=document.createElement('script');script.defer=true;script.src='/js/script.js';document.head.appendChild(script)}function schedule(){if('requestIdleCallback'in window){window.requestIdleCallback(loadAnalytics,{timeout:2000});return}window.setTimeout(loadAnalytics,2000)}if(document.readyState==='complete'){schedule();return}window.addEventListener('load',schedule,{once:true})})();",
}}
/>
</head>

View File

@ -41,7 +41,7 @@ export const Route = createFileRoute("/api/subscribe")({
},
body: JSON.stringify({
email: parsed.data.email,
source: "openrank-waitlist",
source: "openseo-waitlist",
}),
},
);

View File

@ -20,13 +20,13 @@ export const Route = createFileRoute("/blogs/$")({
const data = loaderData as
| { title?: string; description?: string; url?: string }
| undefined;
const title = data?.title ?? "OpenRank Blog";
const title = data?.title ?? "OpenSEO Blog";
const description = data?.description;
return buildPageSeo({
title,
description,
path: data?.url ?? "/blogs",
titleSuffix: "OpenRank Blog",
titleSuffix: "OpenSEO Blog",
ogType: "article",
});
},

View File

@ -4,13 +4,12 @@ import { baseOptions } from "@/lib/layout.shared";
import { getBlogPosts } from "@/lib/content.functions";
import { buildPageSeo } from "@/lib/seo";
const blogIndexDescription =
"Updates and guides from OpenRank.";
const blogIndexDescription = "Updates and guides from OpenSEO.";
export const Route = createFileRoute("/blogs/")({
head: () =>
buildPageSeo({
title: "OpenRank Blog",
title: "OpenSEO Blog",
description: blogIndexDescription,
path: "/blogs",
}),

View File

@ -2,7 +2,7 @@ import { createFileRoute, Link } from "@tanstack/react-router";
import { useState } from "react";
import { toCanonicalUrl } from "@/lib/seo";
const homeTitle = "OpenRank - Own Your SEO";
const homeTitle = "OpenSEO - Own Your SEO";
const homeDescription =
"Own your SEO. Pay only for what you use. No subscriptions. Open source alternative to Semrush and Ahrefs.";
@ -107,7 +107,7 @@ function Home() {
<div className="max-w-3xl mx-auto px-6 py-16 md:py-24">
{/* Nav */}
<nav className="flex items-center justify-between mb-20">
<span className="text-sm font-semibold">OpenRank</span>
<span className="text-sm font-semibold">OpenSEO</span>
<a
href="https://github.com/every-app/open-seo"
target="_blank"
@ -133,9 +133,10 @@ function Home() {
<ul className="mt-5 space-y-3">
{[
"Keyword Research",
"Competitor Domain Insights",
"Backlink Analysis",
"Competitor Insights",
"Site Audits",
"Backlinks, Rank Tracking and more (Coming soon)",
"Rank Tracking and more (Coming soon)",
].map((item) => (
<li key={item} className="flex gap-2.5 text-sm text-neutral-800">
<span className="text-neutral-500 mt-[2px]">&mdash;</span>
@ -219,13 +220,13 @@ function Home() {
loop
playsInline
preload="none"
aria-label="OpenRank product demo"
aria-label="OpenSEO product demo"
>
<source src="/demo.webm" type="video/webm" />
<source src="/demo.mp4" type="video/mp4" />
<img
src="/demo-poster.webp"
alt="OpenRank product demo"
alt="OpenSEO product demo"
width={1280}
height={808}
className="w-full rounded-md border border-neutral-200"
@ -234,7 +235,7 @@ function Home() {
/>
</video>
<p className="text-[11px] text-neutral-600 mt-2">
Keyword research in OpenRank
Keyword research in OpenSEO
</p>
</div>

View File

@ -1,6 +1,7 @@
import { createFileRoute } from "@tanstack/react-router";
const PLAUSIBLE_SCRIPT_URL = "https://plausible.io/js/pa-DllmchvGzcNdY2jEy1-Hc.js";
const PLAUSIBLE_SCRIPT_URL =
"https://plausible.io/js/pa-DllmchvGzcNdY2jEy1-Hc.js";
export const Route = createFileRoute("/js/script.js")({
server: {

View File

@ -5,9 +5,9 @@ export const Route = createFileRoute("/privacy")({
head: () =>
buildPageSeo({
title: "Privacy Policy",
description: "OpenRank privacy policy",
description: "OpenSEO privacy policy",
path: "/privacy",
titleSuffix: "OpenRank",
titleSuffix: "OpenSEO",
}),
component: Privacy,
});
@ -16,8 +16,11 @@ function Privacy() {
return (
<div className="bg-fd-background text-fd-foreground min-h-screen">
<header className="px-6 py-4 border-b border-fd-border">
<Link to="/" className="font-semibold text-fd-foreground hover:opacity-80">
OpenRank
<Link
to="/"
className="font-semibold text-fd-foreground hover:opacity-80"
>
OpenSEO
</Link>
</header>
@ -25,41 +28,42 @@ function Privacy() {
<h1>Privacy Policy</h1>
<p className="text-fd-muted-foreground">Last updated: March 2026</p>
<h2>What we collect</h2>
<p>
When you sign up for our waitlist, we collect your email address. This
is stored securely via Loops.so, our email service provider.
</p>
<h2>How we use it</h2>
<p>
We use your email address to send launch announcements, product updates,
and related OpenRank marketing emails. You can unsubscribe at any time
using the unsubscribe link in any email. We do not sell your data or
share it with third parties beyond our service providers.
</p>
<h2>Website analytics</h2>
<h2>What we collect</h2>
<p>
We use Plausible Analytics to understand aggregate website traffic and
usage patterns (for example, page views and referring sites). Plausible
is cookie-free and does not use cross-site tracking. We route analytics
requests through our own domain before forwarding them to Plausible.
When you sign up for our waitlist, we collect your email address. This
is stored securely via Loops.so, our email service provider.
</p>
<h2>Data storage</h2>
<p>
Your email address is stored in Loops.so's infrastructure. You can request
deletion of your data at any time by emailing{" "}
<a href="mailto:privacy@everyapp.dev">privacy@everyapp.dev</a>.
</p>
<h2>How we use it</h2>
<p>
We use your email address to send launch announcements, product
updates, and related OpenSEO marketing emails. You can unsubscribe at
any time using the unsubscribe link in any email. We do not sell your
data or share it with third parties beyond our service providers.
</p>
<h2>Self-hosted usage</h2>
<p>
If you self-host OpenRank, no data is sent to us. The self-hosted
version communicates directly with DataForSEO's APIs using your own
credentials.
</p>
<h2>Website analytics</h2>
<p>
We use Plausible Analytics to understand aggregate website traffic and
usage patterns (for example, page views and referring sites).
Plausible is cookie-free and does not use cross-site tracking. We
route analytics requests through our own domain before forwarding them
to Plausible.
</p>
<h2>Data storage</h2>
<p>
Your email address is stored in Loops.so's infrastructure. You can
request deletion of your data at any time by emailing{" "}
<a href="mailto:privacy@everyapp.dev">privacy@everyapp.dev</a>.
</p>
<h2>Self-hosted usage</h2>
<p>
If you self-host OpenSEO, no data is sent to us. The self-hosted
version communicates directly with DataForSEO's APIs using your own
credentials.
</p>
<h2>Contact</h2>
<p>

View File

@ -1,28 +1,30 @@
{
"$schema": "node_modules/wrangler/config-schema.json",
"name": "open-rank-landing",
"compatibility_date": "2026-02-19",
"compatibility_flags": [
"nodejs_compat"
],
"main": "@tanstack/react-start/server-entry",
"assets": {
"directory": "./dist/client",
"html_handling": "drop-trailing-slash",
},
"workers_dev": true,
"preview_urls": true,
"routes": [
{
"pattern": "openrank.io",
"custom_domain": true,
},
],
"env": {
"preview": {
"name": "open-rank-landing-preview",
"workers_dev": true,
"preview_urls": true,
},
},
"$schema": "node_modules/wrangler/config-schema.json",
"name": "open-seo-landing",
"compatibility_date": "2026-02-19",
"compatibility_flags": ["nodejs_compat"],
"main": "@tanstack/react-start/server-entry",
"assets": {
"directory": "./dist/client",
"html_handling": "drop-trailing-slash",
},
"workers_dev": true,
"preview_urls": true,
"routes": [
{
"pattern": "openseo.so",
"custom_domain": true,
},
{
"pattern": "www.openseo.so",
"custom_domain": true,
},
],
"env": {
"preview": {
"name": "open-seo-landing-preview",
"workers_dev": true,
"preview_urls": true,
},
},
}