Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
3 changes: 2 additions & 1 deletion website/astro.config.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import sitemap from "@astrojs/sitemap";
import mdx from "@astrojs/mdx";
import react from "@astrojs/react";
import rehypeExternalLinks from "./src/utils/rehype-external-links.ts";
import rehypeAdaptiveTables from "./src/utils/rehype-adaptive-tables.ts";
import playformCompress from "@playform/compress";
import markdownForAgents from "astro-markdown-for-agents";
import { markdownForAgentsOptions } from "./markdown-for-agents.config.mjs";
Expand Down Expand Up @@ -55,7 +56,7 @@ export default defineConfig({
},
site: SITE_BASE_URL,
markdown: {
rehypePlugins: [rehypeExternalLinks],
rehypePlugins: [rehypeExternalLinks, rehypeAdaptiveTables],
},
image: {
domains: ["i.ytimg.com"],
Expand Down
5 changes: 4 additions & 1 deletion website/scripts/check-seo-meta.mjs
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
#!/usr/bin/env node
/**
* Validates SEO title/description lengths for i18n page meta and blog frontmatter.
* Blog posts: use `metaTitle` when set, otherwise `title`.
*
* Latin locales: title 30–60, description 120–160
* CJK locales (ja-JP, ko-KR, zh-CN): title 20–60, description 70–160
Expand Down Expand Up @@ -82,6 +83,7 @@ function parseFrontmatter(raw) {
if (end === -1) return null;
const fm = raw.slice(3, end);
const titleMatch = fm.match(/^title:\s*(.*)$/m);
const metaTitleMatch = fm.match(/^metaTitle:\s*(.*)$/m);
const descMatch = fm.match(/^description:\s*(.*)$/m);
if (!titleMatch || !descMatch) return null;

Expand All @@ -98,6 +100,7 @@ function parseFrontmatter(raw) {

return {
title: unquote(titleMatch[1]),
metaTitle: metaTitleMatch ? unquote(metaTitleMatch[1]) : undefined,
description: unquote(descMatch[1]),
};
}
Expand All @@ -122,7 +125,7 @@ function checkBlogs(errors) {
continue;
}
const rel = path.relative(websiteRoot, file);
checkLength("title", locale, rel, meta.title, errors);
checkLength("title", locale, rel, meta.metaTitle ?? meta.title, errors);
checkLength("description", locale, rel, meta.description, errors);
}
}
Expand Down
146 changes: 136 additions & 10 deletions website/src/components/features/blog/BlogPost.astro
Original file line number Diff line number Diff line change
Expand Up @@ -14,14 +14,17 @@ import { PEOPLE, isPersonId, personId } from "@/constants/people";
import { getPersonJsonLd } from "@/constants/person-jsonld";
import { organizationJsonLd } from "@/constants/default-jsonld";
import { resolveTwitterCreator } from "@/utils/resolve-blog-author";
import { blogMetaTitle } from "@/utils/blog-titles";
import env from "@/config";

type Props = CollectionEntry<"blog">["data"] & {
relatedPosts?: CollectionEntry<"blog">[];
isUnpublishedPreview?: boolean;
};

const {
title,
metaTitle,
description,
pubDate,
updatedDate,
Expand All @@ -30,16 +33,19 @@ const {
tags = [],
author: authorId,
relatedPosts = [],
isUnpublishedPreview = false,
} = Astro.props;

const documentTitle = blogMetaTitle({ title, metaTitle });

const currentLocale = getLocaleFromUrl(Astro.url.pathname);
const t = await createTranslator(currentLocale);

const blogIndexHref = getLocalizedPath(currentLocale, "/blog");
const author = authorId && isPersonId(authorId) ? PEOPLE[authorId] : undefined;

const metadata = createMetadata({
title,
title: documentTitle,
description,
pathname: Astro.url.pathname,
imageUrl: heroImage,
Expand Down Expand Up @@ -102,6 +108,14 @@ const jsonLd = JsonLdGraph({
)
}

{
isUnpublishedPreview && (
<p class="blog-post-unpublished mb-4 font-mono text-[11px] tracking-[0.16em] uppercase">
Unpublished
</p>
)
}

<h1
class="font-primary mb-6 text-[clamp(28px,3.5vw,52px)] leading-[1.18] font-medium text-white"
>
Expand Down Expand Up @@ -208,6 +222,10 @@ const jsonLd = JsonLdGraph({
</Layout>

<style is:global>
.blog-post-unpublished {
color: var(--color-flare);
}

.blog-post-tag-pill {
font-family: var(--font-mono);
font-size: 10px;
Expand Down Expand Up @@ -318,22 +336,130 @@ const jsonLd = JsonLdGraph({
color: var(--color-content-85);
}

.blog-post-prose.prose :where(table):not(:where([class~="not-prose"] *)) {
.blog-post-prose .blog-adaptive-table-wrap {
margin: 0 0 24px;
overflow-x: auto;
border: 1px solid var(--color-content-12);
background: var(--color-content-4);
}

.blog-post-prose .blog-adaptive-table {
width: 100%;
margin: 0;
border-collapse: collapse;
font-size: 16px;
line-height: 1.5;
color: var(--color-content-70);
}

.blog-post-prose.prose :where(th, td):not(:where([class~="not-prose"] *)) {
border: 1px solid var(--color-content-12);
.blog-post-prose .blog-adaptive-table th {
font-family: var(--font-mono);
font-size: 11px;
font-weight: 400;
letter-spacing: 0.14em;
text-transform: uppercase;
text-align: left;
color: var(--color-content-45);
background: transparent;
padding: 12px 16px;
border-bottom: 1px solid var(--color-content-12);
}

.blog-post-prose .blog-adaptive-table td {
padding: 14px 16px;
border-bottom: 1px solid var(--color-content-8);
vertical-align: top;
}

.blog-post-prose.prose :where(th):not(:where([class~="not-prose"] *)) {
.blog-post-prose .blog-adaptive-table tbody tr:last-child td {
border-bottom: none;
}

.blog-post-prose .blog-adaptive-table td:first-child {
color: var(--color-flare);
font-family: var(--font-mono);
font-size: 12px;
letter-spacing: 0.08em;
text-transform: uppercase;
color: var(--color-content-85);
background: rgba(255, 255, 255, 0.04);
font-size: 13px;
font-weight: 400;
letter-spacing: 0.06em;
}

.blog-post-prose .blog-adaptive-table-label {
display: none;
}

@media screen and (width < 768px) {
.blog-post-prose .blog-adaptive-table-wrap {
overflow: visible;
border: none;
background: transparent;
}

.blog-post-prose .blog-adaptive-table,
.blog-post-prose .blog-adaptive-table tbody {
display: flex;
flex-direction: column;
width: 100%;
}

.blog-post-prose .blog-adaptive-table tbody {
gap: 12px;
}

.blog-post-prose .blog-adaptive-table thead {
display: none;
}

.blog-post-prose .blog-adaptive-table tr {
display: flex;
flex-direction: column;
border: 1px solid var(--color-content-12);
background: var(--color-content-4);
}

.blog-post-prose .blog-adaptive-table td {
display: flex;
justify-content: space-between;
align-items: baseline;
gap: 16px;
border-bottom: 1px solid var(--color-content-8);
padding: 12px 16px;
}

.blog-post-prose .blog-adaptive-table td:last-child {
border-bottom: none;
}

.blog-post-prose .blog-adaptive-table td:first-child {
display: block;
font-size: 12px;
letter-spacing: 0.14em;
text-transform: uppercase;
background: var(--color-content-8);
border-bottom: 1px solid var(--color-content-12);
}

.blog-post-prose .blog-adaptive-table-label {
display: block;
flex: 0 1 auto;
font-family: var(--font-mono);
font-size: 10px;
letter-spacing: 0.12em;
text-transform: uppercase;
color: var(--color-content-40);
}

.blog-post-prose .blog-adaptive-table-value {
text-align: right;
color: var(--color-content-70);
}

.blog-post-prose
.blog-adaptive-table
td:first-child
.blog-adaptive-table-value {
text-align: left;
color: inherit;
}
}

.blog-post-prose .twitter-embed {
Expand Down
6 changes: 3 additions & 3 deletions website/src/components/features/community/BlogSection.astro
Original file line number Diff line number Diff line change
@@ -1,20 +1,20 @@
---
import { getCollection } from "astro:content";
import {
createTranslator,
getLocaleFromUrl,
getLocalizedPath,
DEFAULT_LOCALE,
} from "@/utils/i18n";
import { getBlogPosts } from "@/utils/blog-posts";

const locale = getLocaleFromUrl(Astro.url.pathname);
const t = await createTranslator(locale);

let localePosts = await getCollection("blog", ({ id }) => {
let localePosts = await getBlogPosts(({ id }) => {
return id.toLowerCase().startsWith(`${locale.toLowerCase()}/`);
});
if (localePosts.length === 0) {
localePosts = await getCollection("blog", ({ id }) => {
localePosts = await getBlogPosts(({ id }) => {
return id.toLowerCase().startsWith(`${DEFAULT_LOCALE.toLowerCase()}/`);
});
}
Expand Down
6 changes: 3 additions & 3 deletions website/src/components/features/home/BlogSection.astro
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
---
import { getCollection } from "astro:content";
import {
PODCAST_TOTAL_EPISODES,
PODCAST_YOUTUBE_CHANNEL,
Expand All @@ -10,6 +9,7 @@ import {
DEFAULT_LOCALE,
createTranslator,
} from "@/utils/i18n";
import { getBlogPosts } from "@/utils/blog-posts";
import {
formatEpisodeMeta,
getLatestPodcastEpisodes,
Expand All @@ -21,11 +21,11 @@ const locale = getLocaleFromUrl(Astro.url.pathname);
const t = await createTranslator(locale);

// Fetch posts for the current locale, fall back to DEFAULT_LOCALE if none exist
let localePosts = await getCollection("blog", ({ id }) => {
let localePosts = await getBlogPosts(({ id }) => {
return id.toLowerCase().startsWith(`${locale.toLowerCase()}/`);
});
if (localePosts.length === 0) {
localePosts = await getCollection("blog", ({ id }) => {
localePosts = await getBlogPosts(({ id }) => {
return id.toLowerCase().startsWith(`${DEFAULT_LOCALE.toLowerCase()}/`);
});
}
Expand Down
2 changes: 1 addition & 1 deletion website/src/constants/qtps.ts
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
/** @description advertised transparent-tx QTPS (before ZK aggregation) */
export const QTPS = 170;
export const QTPS = 430;
2 changes: 2 additions & 0 deletions website/src/content.config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,12 +8,14 @@ const blog = defineCollection({
schema: z
.object({
title: z.string(),
metaTitle: z.string().min(1).optional(),
description: z.string(),
pubDate: z.coerce.date(),
updatedDate: z.coerce.date().optional(),
heroImage: z.string().optional(),
heroAlt: z.string().optional(),
featured: z.boolean().optional(),
published: z.boolean().default(false),
tags: z.array(z.string()).default([]),
author: z
.enum(["christopher-smith", "joe-mattia", "jonathan-angle"])
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
---
published: true
title: "Quantus Weekly: Dilithium-Schwellenwertsignaturen"
description: "Dilithium-Schwellenwertsignaturen für verteilte Koordination, leichtere ZK-Circuits, Wormhole-Proof-Aggregation und Mobile-Wallet-Updates – unser Weekly Update."

Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
---
published: true
title: "Quantus Weekly: Native Assets und Quantenrisiko"
description: "Warum Kapital Bitcoin wegen Quantenrisiko abschlägt, unsere Native-Assets-Entscheidung und Fortschritte bei Dilithium-Schwellenwert und ZK-Aggregation."

Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
---
published: true
title: "Quantus Weekly: Deniable RPCs und Neodyme-Audit"
description: "Deniable RPCs für stärkere Privatsphäre, abgeschlossenes Neodyme-Rusty-Crystals-Audit und private ZK-Adressen für jeden Token ab Genesis verfügbar."

Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
---
published: true
title: "Quantus Weekly: High-Security-Konten und Betrugsschutz"
description: "High-Security-Konten mit Time Locks und Guardians, Multisig-Integration im Test und neues Recover-Funds-Feature – unser Weekly Update dieser Woche."

Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
---
published: true
title: "Quantus Weekly: Die quantensichere Zukunft kartieren"
description: "Weekly Update: CoinGecko-Listing, Multisig-Optimierungen, ZK-Aggregator-Refactoring und Mobile-App v1.1.5 – das war diese Woche bei Quantus."
pubDate: "2026-02-13"
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
---
published: true
title: "Quantus Weekly: Open Research und Post-Quantum-Standard"
description: "Launch von research.quantus.com, ZK-Proof-Aggregation, Multisig-Pallet-Merge und Mobile-Wallet-Updates – das Weekly Update von Quantus diese Woche."
pubDate: "2026-02-20"
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
---
published: true
title: "Quantus Weekly: Die Wallet soll einfach sein"
description: "Weekly Update: Wallet v1.2.0, Treasury mit Multisig, Heisenberg-Testnet-Updates und Performance-Verbesserungen – das war diese Woche bei Quantus."
pubDate: "2026-02-27"
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
---
published: true
title: "Quantus Weekly: Wormhole-Transaktionen"
description: "Wormhole-Transaktionen, private Blockbelohnungen für Miner, Consensus-Fixes und Wallet-Updates — unser Wochenrückblick bei Quantus."
pubDate: "2026-03-07"
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
---
published: true
title: "Quantus Weekly: Fette Signaturen, schnellere Wormholes"
description: "ML-DSA-Signaturen sind 70× größer als bei Bitcoin. Diese Woche: quantensichere Signierung skaliert, Wormhole-Proofs 2× schneller, ZK-Aggregation voran."
pubDate: "2026-03-16"
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
---
published: true
title: "Quantus Weekly: Zweites Halving, 4× schnellere Proofs"
description: "Zweite Halbierung der Prover-Zeit: 4× schnellere ZK-Proofs in zwei Wochen. Poseidon, Mining-Fixes, Senoti-Limits, Whitepaper und Quantum Canary."
pubDate: "2026-03-24"
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
---
published: true
title: "Quantus Weekly: POS-Modus und P2P-E-Cash"
description: "Mobiles POS in Wallet v1.2.2, PolyFri-Masking, Poseidon-Cleanup, ZK-DDoS-Schutz — und warum P2P-Electronic-Cash für Quantus zählt."
pubDate: "2026-03-31"
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
---
published: true
title: "Quantus Weekly: Q-Day-Schätzungen und On-Spend-Risiko"
description: "Google und Oratomic senken Qubit-Schätzungen für ECC. On-Spend-Risiko bei 10-Minuten-Blöcken und Quantus-Rebrand für dauerhafte wirtschaftliche Freiheit."
pubDate: "2026-04-07"
Expand Down
Loading