Standard.site landing page built in Next.js
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

Merge branch 'refs/heads/dev'

+73 -24
+3
.gitignore
··· 43 43 # jetbrains 44 44 /.idea 45 45 .sequoia-state.json 46 + 47 + # clis 48 + wisp-cli*
+6 -4
.tangled/workflows/deploy.yml
··· 21 21 environment: 22 22 SITE_PATH: './out' 23 23 SITE_NAME: 'Standard.site' 24 - WISP_HANDLE: 'standard.site' 25 24 26 25 steps: 27 26 - name: build site 28 27 command: | 29 28 export PATH="$HOME/.nix-profile/bin:$PATH" 30 29 bun install --frozen-lockfile 30 + bun install -g sequoia-cli 31 + sequoia publish 31 32 bun node_modules/.bin/next build 33 + sequoia inject 32 34 33 35 - name: deploy to wisp 34 36 command: | 35 37 curl https://sites.wisp.place/nekomimi.pet/wisp-cli-binaries/wisp-cli-x86_64-linux -o wisp-cli 36 38 chmod +x wisp-cli 37 - ./wisp-cli deploy "$WISP_HANDLE" \ 38 - --path "$BUILD_PATH" \ 39 + ./wisp-cli deploy "$ATP_IDENTIFIER" \ 40 + --path "$SITE_PATH" \ 39 41 --site "$SITE_NAME" \ 40 - --password "$WISP_APP_PASSWORD" 42 + --password "$ATP_APP_PASSWORD"
+13 -4
app/components/docs/DocsMarkdownContext.tsx
··· 2 2 3 3 import { createContext, useContext } from 'react' 4 4 5 - const DocsMarkdownContext = createContext<string | null>(null) 5 + interface DocsPageContext { 6 + markdown: string | null 7 + atUri: string | null 8 + } 9 + 10 + const DocsMarkdownContext = createContext<DocsPageContext>({ markdown: null, atUri: null }) 6 11 7 - export function DocsMarkdownProvider({ markdown, children }: { markdown: string; children: React.ReactNode }) { 12 + export function DocsMarkdownProvider({ markdown, atUri, children }: { markdown: string; atUri?: string; children: React.ReactNode }) { 8 13 return ( 9 - <DocsMarkdownContext.Provider value={markdown}> 14 + <DocsMarkdownContext.Provider value={{ markdown, atUri: atUri ?? null }}> 10 15 {children} 11 16 </DocsMarkdownContext.Provider> 12 17 ) 13 18 } 14 19 15 20 export function useDocsMarkdown() { 16 - return useContext(DocsMarkdownContext) 21 + return useContext(DocsMarkdownContext).markdown 22 + } 23 + 24 + export function useDocsAtUri() { 25 + return useContext(DocsMarkdownContext).atUri 17 26 }
+16 -1
app/components/docs/DocsPageMenu.tsx
··· 2 2 3 3 import { useState, useRef, useEffect } from 'react' 4 4 import { usePathname } from 'next/navigation' 5 - import { useDocsMarkdown } from './DocsMarkdownContext' 5 + import { useDocsMarkdown, useDocsAtUri } from './DocsMarkdownContext' 6 6 7 7 export function DocsPageMenu() { 8 8 const [open, setOpen] = useState(false) ··· 10 10 const menuRef = useRef<HTMLDivElement>(null) 11 11 const pathname = usePathname() 12 12 const markdown = useDocsMarkdown() 13 + const atUri = useDocsAtUri() 13 14 14 15 const slug = (() => { 15 16 const path = pathname.split(/[?#]/)[0] ··· 100 101 </svg> 101 102 View raw Markdown 102 103 </button> 104 + {atUri && ( 105 + <a 106 + href={`https://pdsls.dev/${atUri}`} 107 + target="_blank" 108 + rel="noopener noreferrer" 109 + onClick={() => setOpen(false)} 110 + className="w-full flex items-center gap-2 px-3 py-2 text-sm text-muted hover:text-base-content hover:bg-base-300 rounded-lg transition-colors" 111 + > 112 + <svg className="w-4 h-4" fill="none" viewBox="0 0 24 24" stroke="currentColor"> 113 + <path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M10 6H6a2 2 0 00-2 2v10a2 2 0 002 2h10a2 2 0 002-2v-4M14 4h6m0 0v6m0-6L10 14" /> 114 + </svg> 115 + View on pdsls.dev 116 + </a> 117 + )} 103 118 </div> 104 119 )} 105 120 </div>
+11 -5
app/docs/[...slug]/page.tsx
··· 20 20 'faq': () => import('@/content/docs/faq.mdx'), 21 21 } 22 22 23 - async function getFrontmatter(slugPath: string): Promise<{ title?: string; description?: string }> { 23 + async function getFrontmatter(slugPath: string): Promise<{ title?: string; description?: string; ogImage?: string; atUri?: string }> { 24 24 const filePath = join(process.cwd(), 'content', 'docs', `${slugPath}.mdx`) 25 25 const raw = await readFile(filePath, 'utf-8') 26 26 ··· 31 31 for (const line of match[1].split('\n')) { 32 32 const [key, ...rest] = line.split(':') 33 33 if (key && rest.length) { 34 - frontmatter[key.trim()] = rest.join(':').trim() 34 + frontmatter[key.trim()] = rest.join(':').trim().replace(/^["']|["']$/g, '') 35 35 } 36 36 } 37 37 ··· 53 53 54 54 if (!docsContent[slugPath]) return {} 55 55 56 - const { title, description } = await getFrontmatter(slugPath) 56 + const { title, description, ogImage } = await getFrontmatter(slugPath) 57 57 58 58 return { 59 59 title: title ? `${title} - Standard.site` : undefined, 60 60 description, 61 + openGraph: { 62 + title: title ? `${title} - Standard.site` : undefined, 63 + description, 64 + images: ogImage ? [`/media/${ogImage}`] : undefined, 65 + }, 61 66 } 62 67 } 63 68 ··· 74 79 notFound() 75 80 } 76 81 77 - const [{ default: Content }, markdown] = await Promise.all([ 82 + const [{ default: Content }, markdown, { atUri }] = await Promise.all([ 78 83 loader(), 79 84 getDocMarkdown(slugPath), 85 + getFrontmatter(slugPath), 80 86 ]) 81 87 82 88 return ( 83 - <DocsMarkdownProvider markdown={markdown}> 89 + <DocsMarkdownProvider markdown={markdown} atUri={atUri}> 84 90 <Content /> 85 91 </DocsMarkdownProvider> 86 92 )
+1
content/docs/faq.mdx
··· 3 3 description: Common questions about Standard.site and implementing the lexicons. 4 4 date: 2026-02-10 5 5 atUri: "at://did:plc:re3ebnp5v7ffagz6rb6xfei4/site.standard.document/3mek5jhr66a27" 6 + ogImage: opengraph-image-docs-faq.png 6 7 --- 7 8 8 9 import { StandardSite } from '@/app/components/docs'
+2 -1
content/docs/implementations.mdx
··· 1 1 --- 2 2 title: Implementations 3 - description: Projects and tools using Standard.site lexicons to build interoperable platforms on AT Protocol. 3 + description: Projects and tools using Standard.site lexicons. 4 4 date: 2026-02-10 5 5 atUri: "at://did:plc:re3ebnp5v7ffagz6rb6xfei4/site.standard.document/3mek5jhpjfd2j" 6 + ogImage: opengraph-image-docs-implementations-v2.png 6 7 --- 7 8 8 9 import { LinkCard } from '@/app/components/docs'
+2 -1
content/docs/introduction.mdx
··· 1 1 --- 2 2 title: Introduction 3 - description: A brief introduction into what the Standard.site lexicon is, what it's used for, and how to implement it. 3 + description: A brief introduction to Standard.site lexicons, what they are, and how they're used. 4 4 date: 2026-02-10 5 5 atUri: "at://did:plc:re3ebnp5v7ffagz6rb6xfei4/site.standard.document/3mek5jhntva2i" 6 + ogImage: opengraph-image-docs-introduction-v2.png 6 7 --- 7 8 8 9 import { StandardSite } from '@/app/components/docs'
+2 -1
content/docs/lexicons/document.mdx
··· 1 1 --- 2 2 title: Document Lexicon 3 - description: Schema reference for site.standard.document, the lexicon that provides metadata for documents published on the web. 3 + description: Schema reference for documents, used to provide metadata for documents published on the web. 4 4 date: 2026-02-10 5 5 atUri: "at://did:plc:re3ebnp5v7ffagz6rb6xfei4/site.standard.document/3mek5jhy7fc25" 6 + ogImage: opengraph-image-docs-document-lexicon-v2.png 6 7 --- 7 8 8 9 import { Table } from '@/app/components/docs'
+2 -1
content/docs/lexicons/publication.mdx
··· 1 1 --- 2 2 title: Publication Lexicon 3 - description: Schema reference for site.standard.publication, the lexicon used to describe information about a particular publication. 3 + description: Schema reference for publications, used to describe information about a particular publication. 4 4 date: 2026-02-10 5 5 atUri: "at://did:plc:re3ebnp5v7ffagz6rb6xfei4/site.standard.document/3mek5jhwhcv26" 6 + ogImage: opengraph-image-docs-publication-lexicon-v2.png 6 7 --- 7 8 8 9 import { Table } from '@/app/components/docs'
+2 -1
content/docs/lexicons/subscription.mdx
··· 1 1 --- 2 2 title: Subscription Lexicon 3 - description: Schema reference for site.standard.graph.subscription, the lexicon used to tracks relationships between users and publications. 3 + description: Schema reference for subscriptions, used to tracks relationships between users and publications. 4 4 date: 2026-02-10 5 5 atUri: "at://did:plc:re3ebnp5v7ffagz6rb6xfei4/site.standard.document/3mek5jhupfh2p" 6 + ogImage: opengraph-image-docs-subscription-lexicon-v2.png 6 7 --- 7 8 8 9 import { Table } from '@/app/components/docs'
+2 -1
content/docs/lexicons/theme.mdx
··· 1 1 --- 2 2 title: Basic Theme Lexicon 3 - description: Schema reference for site.standard.theme.basic, the lexicon provides a simplified theme definition for publications. 3 + description: Schema reference for the basic theme, provides a simplified theme definition for publications. 4 4 date: 2026-02-10 5 5 atUri: "at://did:plc:re3ebnp5v7ffagz6rb6xfei4/site.standard.document/3mek5jhsxa32c" 6 + ogImage: opengraph-image-docs-basic-theme-lexicon-v2.png 6 7 --- 7 8 8 9 import { Table } from '@/app/components/docs'
+2 -1
content/docs/permissions.mdx
··· 1 1 --- 2 2 title: Permissions 3 - description: Standard.site provides a permission set for applications to access publications, documents, and subscriptions. 3 + description: A permission set for applications to access Standard.site publications, documents, and subscriptions. 4 4 date: 2026-02-10 5 5 atUri: "at://did:plc:re3ebnp5v7ffagz6rb6xfei4/site.standard.document/3mek5jhm5mx2m" 6 + ogImage: opengraph-image-docs-permissions-v2.png 6 7 --- 7 8 8 9 import { Table } from '@/app/components/docs'
+2 -1
content/docs/quick-start.mdx
··· 1 1 --- 2 2 title: Quick Start 3 - description: The quick start guide to implement Standard.site lexicons in your site, tool or app. 3 + description: Getting started with Standard.site lexicons. 4 4 date: 2026-02-10 5 5 atUri: "at://did:plc:re3ebnp5v7ffagz6rb6xfei4/site.standard.document/3mek5jhkri72r" 6 + ogImage: opengraph-image-docs-quick-start-v2.png 6 7 --- 7 8 8 9 import { StandardSite } from '@/app/components/docs'
+2 -1
content/docs/verification.mdx
··· 1 1 --- 2 2 title: Verification 3 - description: Reference guide to understand how Standard.site records are verified to avoid impersonation or spam. 3 + description: Understanding how Standard.site records are verified to avoid impersonation or spam.. 4 4 date: 2026-02-10 5 5 atUri: "at://did:plc:re3ebnp5v7ffagz6rb6xfei4/site.standard.document/3mek5jhip372r" 6 + ogImage: opengraph-image-docs-verification-v2.png 6 7 --- 7 8 8 9
public/media/opengraph-image-docs-basic-theme-lexicon-v2.png

This is a binary file and will not be displayed.

public/media/opengraph-image-docs-document-lexicon-v2.png

This is a binary file and will not be displayed.

public/media/opengraph-image-docs-faq.png

This is a binary file and will not be displayed.

public/media/opengraph-image-docs-implementations-v2.png

This is a binary file and will not be displayed.

public/media/opengraph-image-docs-introduction-v2.png

This is a binary file and will not be displayed.

public/media/opengraph-image-docs-permissions-v2.png

This is a binary file and will not be displayed.

public/media/opengraph-image-docs-publication-lexicon-v2.png

This is a binary file and will not be displayed.

public/media/opengraph-image-docs-quick-start-v2.png

This is a binary file and will not be displayed.

public/media/opengraph-image-docs-subscription-lexicon-v2.png

This is a binary file and will not be displayed.

public/media/opengraph-image-docs-verification-v2.png

This is a binary file and will not be displayed.

+5 -1
sequoia.json
··· 1 1 { 2 2 "siteUrl": "https://standard.site", 3 + "identity": "standard.site", 3 4 "contentDir": "./content", 5 + "imagesDir": "./public/media", 4 6 "outputDir": "./out", 7 + "pathPrefix": "", 5 8 "publicationUri": "at://did:plc:re3ebnp5v7ffagz6rb6xfei4/site.standard.publication/3me5vykp6lf2y", 6 9 "frontmatter": { 7 - "publishDate": "date" 10 + "publishDate": "date", 11 + "cover": "ogImage" 8 12 } 9 13 }