Skip to content

Commit 43f4d5d

Browse files
chore(projects): remove .env.example, add Fusion Framework and Cipher Scope to project list, and enhance project metadata and images
1 parent 28859cf commit 43f4d5d

19 files changed

Lines changed: 200 additions & 86 deletions

File tree

‎.env.example‎

Lines changed: 0 additions & 22 deletions
This file was deleted.

‎public/images/cipher-scope.png‎

4.36 KB
Loading

‎public/images/cipher-token.png‎

74.7 KB
Loading

‎public/images/logo-fusion.jpg‎

13 KB
Loading

‎public/images/logo-fusion.png‎

18.5 KB
Loading

‎public/images/npm-mirrors.png‎

10.5 KB
Loading

‎public/llms.txt‎

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,16 @@
1919

2020
## Projects
2121

22-
- Cipher Token: https://cipherunit.xyz/projects/cipher-token — high-performance Rust JWT/crypto library with Python (PyO3) bindings
22+
- Fusion Framework: https://cipherunit.xyz/projects/fusion-framework — one framework, multiple languages for modern app development
23+
- GitHub: https://github.com/cipherunits/fusion-framework
24+
- Image: https://cipherunit.xyz/images/logo-fusion.png
25+
- Cipher Token: https://cipherunit.xyz/projects/cipher-token — high-performance Rust token/crypto utilities with Python (PyO3) bindings
2326
- GitHub: https://github.com/cipherunits/CipherToken
2427
- Image: https://cipherunit.xyz/images/cipher-token.png
25-
- NPM Mirror: https://cipherunit.xyz/projects/npm-mirror — offline npm package mirror with Docker Compose
28+
- Cipher Scope: https://cipherunit.xyz/projects/cipher-scope — runtime visibility CLI for modern apps (banner, env, tooling context)
29+
- GitHub: https://github.com/cipherunits/CipherScope
30+
- Image: https://cipherunit.xyz/images/cipher-scope.png
31+
- NPM Mirror: https://cipherunit.xyz/projects/npm-mirror — offline npm package cache/mirror for unreliable networks
2632
- GitHub: https://github.com/cipherunits/npm-mirror
2733
- Image: https://cipherunit.xyz/images/npm-mirrors.png
2834

‎scripts/seo-notify.mjs‎

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,25 @@
88
const SITE = process.env.SITE_NAME || "https://cipherunit.xyz";
99
const INDEXNOW_KEY = "cipherunit-indexnow-2026";
1010

11+
const projectSlugs = [
12+
"fusion-framework",
13+
"cipher-token",
14+
"cipher-scope",
15+
"npm-mirror",
16+
];
17+
18+
const projectImages = [
19+
`${SITE}/images/logo-fusion.png`,
20+
`${SITE}/images/cipher-token.png`,
21+
`${SITE}/images/cipher-scope.png`,
22+
`${SITE}/images/npm-mirrors.png`,
23+
];
24+
1125
const urls = [
1226
`${SITE}/`,
1327
`${SITE}/projects`,
14-
`${SITE}/projects/cipher-token`,
15-
`${SITE}/projects/npm-mirror`,
28+
...projectSlugs.map((slug) => `${SITE}/projects/${slug}`),
29+
...projectImages,
1630
`${SITE}/team`,
1731
`${SITE}/contact`,
1832
`${SITE}/sitemap.xml`,
@@ -49,8 +63,7 @@ async function main() {
4963
for (const url of [
5064
`${SITE}/`,
5165
`${SITE}/projects`,
52-
`${SITE}/projects/cipher-token`,
53-
`${SITE}/projects/npm-mirror`,
66+
...projectSlugs.map((slug) => `${SITE}/projects/${slug}`),
5467
`${SITE}/team`,
5568
`${SITE}/contact`,
5669
]) {

‎src/app/layout.tsx‎

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,11 @@ export const metadata: Metadata = {
5353
"CipherUnit",
5454
"cipher unit",
5555
"cipherunit",
56+
"cipherunits",
57+
"cipher units",
58+
"Cipherunits",
59+
"CipherUnits",
60+
"Cipher Units",
5661
"cipher unit github",
5762
"open source developer tools",
5863
"developer tools",
@@ -172,7 +177,7 @@ export default function RootLayout({
172177
<body className={`${inter.className} antialiased`}>
173178
<a
174179
href="#main-content"
175-
className="absolute left-4 top-4 z-[100] -translate-y-16 rounded-md border border-(--color-primery) bg-(--color-surface) px-4 py-2 text-sm text-white shadow-lg transition focus:translate-y-0"
180+
className="absolute left-4 top-4 z-100 -translate-y-16 rounded-md border border-(--color-primery) bg-(--color-surface) px-4 py-2 text-sm text-white shadow-lg transition focus:translate-y-0"
176181
>
177182
Skip to main content
178183
</a>

‎src/app/projects/[slug]/page.tsx‎

Lines changed: 36 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,13 @@ import NamePage from "@/components/shared/NamePage";
1212
import SubNamePage from "@/components/shared/SubNamePage";
1313
import { getProjectBySlug, projects } from "@/lib/projects";
1414
import {
15+
PROJECT_IMAGE_HEIGHT,
16+
PROJECT_IMAGE_WIDTH,
17+
projectImageAlt,
1518
projectImageCaption,
19+
projectImageEncodingFormat,
1620
projectImageTitle,
21+
projectOgImage,
1722
projectPagePath,
1823
} from "@/lib/seo-images";
1924
import { absoluteUrl, brandOgImages, siteConfig } from "@/lib/site";
@@ -42,7 +47,13 @@ export async function generateMetadata({
4247
}
4348

4449
const pageUrl = absoluteUrl(projectPagePath(project));
50+
const imageUrl = absoluteUrl(project.imageUrl);
51+
const imageTitle = projectImageTitle(project);
4552
const title = `${project.title} | Cipher Unit Open Source Project`;
53+
const techKeywords = project.tech
54+
.split("•")
55+
.map((part) => part.trim())
56+
.filter(Boolean);
4657

4758
return {
4859
title: { absolute: title },
@@ -52,8 +63,13 @@ export async function generateMetadata({
5263
"Cipher Unit",
5364
"CipherUnit",
5465
"open source",
66+
"open source project",
67+
"developer tools",
5568
...project.programmingLanguages,
69+
...techKeywords,
5670
],
71+
category: "Technology",
72+
classification: "Software Development",
5773
alternates: {
5874
canonical: projectPagePath(project),
5975
},
@@ -78,20 +94,17 @@ export async function generateMetadata({
7894
siteName: siteConfig.name,
7995
title: `${project.title} — Cipher Unit`,
8096
description: project.description,
81-
images: [
82-
{
83-
url: project.imageUrl,
84-
alt: projectImageTitle(project),
85-
type: "image/png" as const,
86-
},
87-
...brandOgImages(`${project.title} by Cipher Unit`),
88-
],
97+
images: [projectOgImage(project), ...brandOgImages(`${project.title} by Cipher Unit`)],
8998
},
9099
twitter: {
91100
card: "summary_large_image",
92101
title: `${project.title} — Cipher Unit`,
93102
description: project.description,
94-
images: [project.imageUrl],
103+
images: [imageUrl],
104+
},
105+
other: {
106+
"og:image:alt": imageTitle,
107+
"image": imageUrl,
95108
},
96109
};
97110
}
@@ -106,6 +119,9 @@ export default async function ProjectPage({ params }: ProjectPageProps) {
106119

107120
const imageTitle = projectImageTitle(project);
108121
const imageCaption = projectImageCaption(project);
122+
const imageAlt = projectImageAlt(project);
123+
const absoluteImageUrl = absoluteUrl(project.imageUrl);
124+
const encodingFormat = projectImageEncodingFormat(project.imageUrl);
109125

110126
return (
111127
<main
@@ -137,28 +153,30 @@ export default async function ProjectPage({ params }: ProjectPageProps) {
137153
<meta itemProp="creator" content="Cipher Unit" />
138154

139155
<figure
140-
className="relative aspect-video w-full overflow-hidden"
156+
className="relative aspect-video w-full overflow-hidden bg-[#2c3138]"
141157
itemProp="image"
142158
itemScope
143159
itemType="https://schema.org/ImageObject"
144160
>
145-
<meta
146-
itemProp="contentUrl"
147-
content={absoluteUrl(project.imageUrl)}
148-
/>
149-
<meta itemProp="url" content={absoluteUrl(project.imageUrl)} />
161+
<meta itemProp="contentUrl" content={absoluteImageUrl} />
162+
<meta itemProp="url" content={absoluteImageUrl} />
150163
<meta itemProp="name" content={imageTitle} />
151164
<meta itemProp="caption" content={imageCaption} />
165+
<meta itemProp="description" content={imageCaption} />
166+
<meta itemProp="encodingFormat" content={encodingFormat} />
167+
<meta itemProp="width" content={String(PROJECT_IMAGE_WIDTH)} />
168+
<meta itemProp="height" content={String(PROJECT_IMAGE_HEIGHT)} />
169+
<meta itemProp="representativeOfPage" content="true" />
152170
<Image
153171
src={project.imageUrl}
154-
overrideSrc={absoluteUrl(project.imageUrl)}
155-
alt={`${project.title} open source software developed by Cipher Unit (CipherUnit). ${project.description}`}
172+
overrideSrc={absoluteImageUrl}
173+
alt={imageAlt}
156174
title={imageTitle}
157175
fill
158176
priority
159177
quality={90}
160178
sizes="(max-width: 1024px) 100vw, 1152px"
161-
className="object-cover"
179+
className="object-contain"
162180
/>
163181
<figcaption className="sr-only">{imageCaption}</figcaption>
164182
</figure>

0 commit comments

Comments
 (0)