From af4bbdb778007eae039298ee6a4e234b057f297c Mon Sep 17 00:00:00 2001 From: Derrick Hammer Date: Wed, 27 Dec 2023 07:19:03 -0500 Subject: [PATCH] feat: initial seo efforts --- app/images/og_default.png | Bin 0 -> 15707 bytes app/lib/meta.ts | 17 +++++++++++++++++ app/routes/__info.about.tsx | 8 ++++++++ app/routes/__info.donate.tsx | 8 ++++++++ app/routes/_index.tsx | 8 ++++++++ app/routes/article.$cid.tsx | 13 +++++++++++++ app/routes/search.tsx | 8 ++++++++ 7 files changed, 62 insertions(+) create mode 100644 app/images/og_default.png create mode 100644 app/lib/meta.ts diff --git a/app/images/og_default.png b/app/images/og_default.png new file mode 100644 index 0000000000000000000000000000000000000000..fe2c5fb56f5258c1e4c59ef9b08e053b4835f1b8 GIT binary patch literal 15707 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 U`<|@^+?EC@D`?2q$XbN`Kb^d4CjbBd literal 0 HcmV?d00001 diff --git a/app/lib/meta.ts b/app/lib/meta.ts new file mode 100644 index 0000000..e72f808 --- /dev/null +++ b/app/lib/meta.ts @@ -0,0 +1,17 @@ +import OGImage from "../images/og_default.png"; + +export function generateMetaTags( + title: string, + description: string, + imageUrl = OGImage, + ogType: "website" | "article" = "website" +) { + return [ + { name: "title", content: title }, + { name: "description", content: description }, + { name: "og:title", content: title }, + { name: "og:description", content: description }, + { name: "og:image", content: imageUrl }, + { name: "og:type", content: ogType }, + ]; +} diff --git a/app/routes/__info.about.tsx b/app/routes/__info.about.tsx index a1bc4f6..71bf7c9 100644 --- a/app/routes/__info.about.tsx +++ b/app/routes/__info.about.tsx @@ -2,7 +2,15 @@ import { ArrowIcon } from "@/components/ArrowIcon"; import * as GraphicSection from "@/components/GraphicSection"; import Logo from "@/images/lume-logo-bg.png"; +import { generateMetaTags } from "@/lib/meta.js"; +export function meta() { + const title = "About - web3.news: Uniting Web3 Community"; + const description = + "Explore web3.news's mission to unite the Web3, Crypto, and DeFi communities under shared values of free speech, financial freedom, and privacy. Join our collaborative journey towards a technology-driven future."; + + return [...generateMetaTags(title, description)]; +} export default function Page() { return ( diff --git a/app/routes/__info.donate.tsx b/app/routes/__info.donate.tsx index 9bd605d..2e44359 100644 --- a/app/routes/__info.donate.tsx +++ b/app/routes/__info.donate.tsx @@ -1,5 +1,13 @@ import { Link } from "@remix-run/react"; +import { generateMetaTags } from "@/lib/meta.js"; +export function meta() { + const title = "Support - web3.news: Empowering a User-Owned Web"; + const description = + "Join the mission of web3.news to shape an open, decentralized web. Your support fuels our commitment to community-driven innovation, transparency, and education in the Web3 space. Help us maintain our ad-free, user-focused platform. Donate now to be a part of this transformative journey."; + + return [...generateMetaTags(title, description)]; +} export default function Page() { return (
diff --git a/app/routes/_index.tsx b/app/routes/_index.tsx index bb51d34..4de2285 100644 --- a/app/routes/_index.tsx +++ b/app/routes/_index.tsx @@ -10,12 +10,20 @@ import { json, LoaderFunction, redirect } from "@remix-run/node"; import { useLoaderData } from "@remix-run/react"; import type { SiteList } from "@/types.js"; import { getAvailableSites } from "@/utils"; +import { generateMetaTags } from "@/lib/meta.js"; type LoaderData = { data: ApiResponse
; sites: SiteList; }; +export function meta() { + const title = "web3.news - Your Community Hub for Web3 & Blockchain News"; + const description = + "Explore the pulse of the Web3 and blockchain world on web3.news, a community-driven platform championing privacy, free speech, and informed collaboration. Dive into the latest in Crypto and DeFi with us."; + + return [...generateMetaTags(title, description)]; +} export let loader: LoaderFunction = async ({ request }) => { const url = new URL(request.url); const referer = request.headers.get("referer"); diff --git a/app/routes/article.$cid.tsx b/app/routes/article.$cid.tsx index cde3c30..a2f04b5 100644 --- a/app/routes/article.$cid.tsx +++ b/app/routes/article.$cid.tsx @@ -3,6 +3,19 @@ import { ArrowLeftIcon } from "@heroicons/react/24/outline"; import { prisma } from "@/lib/prisma"; import { LoaderFunctionArgs } from "@remix-run/node"; import { Article } from "@prisma/client"; +import { generateMetaTags } from "@/lib/meta.js"; + +export function meta({ data }: { data: Article }) { + const title = `${data.title} - web3.news`; + const description = `Read "${data.title}" on web3.news. Dive into insightful Web3 and blockchain discussions and stay updated with the latest trends and developments.`; + + return [ + ...generateMetaTags(title, description, undefined, "article"), + { name: "og:url", content: data.url }, + { name: "twitter:url", content: data.url }, + { name: "canonical", content: data.url }, + ]; +} // Loader function to fetch article data export async function loader({ params }: LoaderFunctionArgs) { diff --git a/app/routes/search.tsx b/app/routes/search.tsx index 25f3117..2e32c43 100644 --- a/app/routes/search.tsx +++ b/app/routes/search.tsx @@ -5,6 +5,7 @@ import SimplifiedSearchBar from "@/components/SimplifiedSearchBar"; import { Link, useLoaderData, useSearchParams } from "@remix-run/react"; import { json, LoaderFunction } from "@remix-run/node"; import type { SearchResult, SiteList } from "@/types.js"; +import { generateMetaTags } from "@/lib/meta.js"; type LoaderData = { sites: SiteList; @@ -12,6 +13,13 @@ type LoaderData = { query: string; }; +export function meta() { + const title = "Search - web3.news: Discover Community Web3 News"; + const description = + "Explore a vast array of Web3, Crypto, and DeFi news and insights. Use web3.news search to dive deep into community-driven content, uncovering the latest trends and developments in the decentralized world."; + + return [...generateMetaTags(title, description)]; +} export let loader: LoaderFunction = async ({ request }) => { const sites = getAvailableSites(); const search = new URL(request.url).searchParams;