Skip to content
Closed
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
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions .env.example
Original file line number Diff line number Diff line change
Expand Up @@ -44,5 +44,9 @@ NEXT_PUBLIC_API_URL="http://localhost:3001"
MARBLE_WORKSPACE_KEY=
MARBLE_API_URL=https://api.marblecms.com

# Not Necessary unless using changelog
NOTRA_API_KEY=
NOTRA_ORGANIZATION_ID=

UPSTASH_QSTASH_TOKEN="i love you upstash"
UPSTASH_QSTASH_TOKEN=test-upstash-qstash-token
201 changes: 201 additions & 0 deletions apps/docs/app/(home)/changelog/page.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,201 @@
import { RocketLaunchIcon } from "@phosphor-icons/react/ssr";
import type { Metadata } from "next";
import Image from "next/image";
import Link from "next/link";
import { Footer } from "@/components/footer";
import Section from "@/components/landing/section";
import { Spotlight } from "@/components/landing/spotlight";
import { Prose } from "@/components/prose";
import { StructuredData } from "@/components/structured-data";
import type { NotraPost } from "@/lib/changelog-query";
import { getChangelogs } from "@/lib/changelog-query";
import {
externalizeLinks,
formatChangelogDate,
splitChangelogContent,
} from "@/lib/changelog-utils";

export const revalidate = 3600;

export const metadata: Metadata = {
title: "Changelog | Databuddy",
description:
"Stay up to date with the latest features, improvements, and fixes shipped to Databuddy.",
alternates: {
canonical: "https://www.databuddy.cc/changelog",
},
openGraph: {
title: "Changelog | Databuddy",
description:
"Stay up to date with the latest features, improvements, and fixes shipped to Databuddy.",
url: "https://www.databuddy.cc/changelog",
images: ["/og-image.png"],
},
twitter: {
card: "summary_large_image",
title: "Changelog | Databuddy",
description:
"Stay up to date with the latest features, improvements, and fixes shipped to Databuddy.",
images: ["/og-image.png"],
},
};

function ChangelogEntry({
post,
isLast,
}: {
post: NotraPost;
isLast: boolean;
}) {
const { description, body } = splitChangelogContent(
externalizeLinks(post.content)
);

return (
<div
className={`flex flex-col gap-4 lg:flex-row lg:gap-0 ${
isLast ? "" : "border-border/40 border-b border-dashed"
}`}
>
<div className="w-full shrink-0 px-5 pt-6 sm:px-6 lg:w-[32%] lg:px-8">
<div className="lg:sticky lg:top-20 lg:pb-6">
<time className="mb-2 block font-mono text-[0.6875rem] text-muted-foreground/50 uppercase tracking-wider">
{formatChangelogDate(post.createdAt)}
</time>
<h2 className="font-semibold text-base text-foreground leading-snug tracking-tight lg:text-lg">
{post.title}
</h2>
{description && (
<Prose
className="prose-sm mt-3 prose-p:text-muted-foreground/60 prose-p:text-xs prose-p:leading-relaxed"
html={description}
/>
)}
</div>
</div>

<div className="w-full px-5 pb-8 sm:px-6 lg:w-[68%] lg:px-8 lg:py-6">
{body ? (
<Prose
className="prose-sm prose-ul:my-1 prose-h2:mt-4 prose-h3:mt-3 prose-h2:mb-2 prose-h3:mb-1.5 prose-ul:space-y-0.5 prose-h3:border-border/40 prose-h3:border-b prose-h3:border-dashed prose-h3:pb-1 prose-h1:font-medium prose-h2:font-medium prose-h3:font-medium prose-h4:font-medium prose-h1:text-base prose-h2:text-sm prose-h3:text-xs prose-h4:text-xs prose-li:text-muted-foreground/70 prose-li:text-xs prose-p:text-muted-foreground/70 prose-p:text-xs prose-p:leading-relaxed prose-h1:tracking-tight prose-h2:tracking-tight sm:prose-h1:text-base sm:prose-h2:text-sm sm:prose-h3:text-xs"
html={body}
/>
) : (
<p className="text-muted-foreground/50 text-xs italic">
No additional details.
</p>
)}
</div>
</div>
);
}

export default async function ChangelogPage() {
const result = await getChangelogs();
const posts = "error" in result ? [] : result.posts;

return (
<div>
<StructuredData
page={{
title: "Changelog | Databuddy",
description:
"Stay up to date with the latest features, improvements, and fixes shipped to Databuddy.",
url: "https://www.databuddy.cc/changelog",
}}
/>
<Spotlight transform="translateX(-60%) translateY(-50%)" />

<Section className="overflow-hidden" customPaddings id="changelog-hero">
<section className="relative w-full pt-16 pb-10 sm:pt-20 sm:pb-12 lg:pt-24 lg:pb-14">
<div className="mx-auto w-full max-w-6xl px-4 sm:px-6 lg:px-8">
<div className="mb-8 text-center lg:mb-10">
<div className="mx-auto mb-3 inline-flex items-center gap-2 rounded border border-border bg-card/50 px-2.5 py-1 font-medium text-[0.6875rem] text-muted-foreground tracking-wide">
<span
aria-hidden="true"
className="h-1.5 w-1.5 rounded bg-foreground/60"
/>
DATABUDDY
<span className="text-foreground/40">•</span>
CHANGELOG
</div>
<h1 className="mb-2 font-semibold text-3xl leading-tight tracking-tight sm:text-4xl md:text-5xl lg:text-5xl">
What&apos;s new in Databuddy
</h1>
<p className="mx-auto max-w-2xl text-balance font-medium text-muted-foreground text-xs leading-relaxed tracking-tight sm:text-sm lg:text-base">
All the latest features, improvements, and fixes shipped to
Databuddy, straight from the team.
</p>
</div>
</div>
</section>
</Section>

<Section
className="border-border border-t bg-background/50"
customPaddings
id="changelog-entries"
>
<div className="relative mx-auto max-w-5xl pt-8 sm:pt-10">
<div className="pointer-events-none absolute top-0 bottom-0 left-[32%] hidden border-border/40 border-l lg:block" />
{posts.length > 0 ? (
<div className="flex flex-col">
{posts.map((post, i) => (
<ChangelogEntry
isLast={i === posts.length - 1}
key={post.id}
post={post}
/>
))}
</div>
) : (
<div className="flex items-center justify-center px-5 py-20 sm:px-6 lg:px-8">
<div className="text-center">
<RocketLaunchIcon
className="mx-auto mb-4 h-12 w-12 text-muted-foreground/40"
weight="duotone"
/>
<h3 className="mb-2 font-medium text-foreground text-lg tracking-tight">
No releases yet
</h3>
<p className="max-w-xs text-muted-foreground/60 text-sm leading-relaxed">
We&apos;re working hard on new features. Check back soon for
the latest updates.
</p>
</div>
</div>
)}
</div>
<div className="py-6">
<Link
className="mx-auto flex w-fit items-center gap-2 rounded-full border border-border/40 bg-card/30 px-4 py-2 text-muted-foreground/50 transition-colors hover:border-border/60 hover:text-muted-foreground/70"
href="https://www.usenotra.com"
rel="noopener"
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Missing noreferrer on external badge link

The "Powered by Notra" link uses rel="noopener" but omits noreferrer. Without noreferrer, the browser sends a Referer header to usenotra.com revealing the origin URL, and (in older browsers) the opened window can still access window.opener. Best practice for target="_blank" links is rel="noopener noreferrer".

Suggested change
rel="noopener"
rel="noopener noreferrer"

target="_blank"
>
<span className="text-xs tracking-wide">Powered by</span>
<Image
alt=""
aria-hidden
className="shrink-0"
height={16}
src="/notra.svg"
width={16}
/>
<span className="font-medium text-xs tracking-wide">Notra</span>
</Link>
</div>
</Section>

<div className="w-full">
<div className="mx-auto h-px max-w-6xl bg-linear-to-r from-transparent via-border/30 to-transparent" />
</div>

<Footer />

<div className="w-full">
<div className="mx-auto h-px max-w-6xl bg-linear-to-r from-transparent via-border/30 to-transparent" />
</div>
</div>
);
}
4 changes: 4 additions & 0 deletions apps/docs/components/docs-navbar.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -300,6 +300,10 @@ export const navMenu = [
name: "Blog",
path: "/blog",
},
{
name: "Changelog",
path: "/changelog",
},
{
name: "Pricing",
path: "/pricing",
Expand Down
4 changes: 2 additions & 2 deletions apps/docs/components/icons/ccpa.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -13,10 +13,10 @@ export function CCPAIcon(props: SVGProps<SVGSVGElement>) {
>
<title>CCPA</title>
<path
clip-rule="evenodd"
clipRule="evenodd"
d="M9.74.676h12.141c.48 0 .868.388.868.867v5.346c0 6.402-5.441 8.835-6.686 9.307a.697.697 0 01-.504 0c-1.245-.472-6.686-2.905-6.686-9.307V1.543c0-.479.388-.867.867-.867zm10.843 5.317a.976.976 0 00-1.4-1.359L15.057 8.89l-1.713-1.766a.976.976 0 00-1.4 1.358l2.412 2.489a.976.976 0 001.401 0l4.826-4.977z"
fill="currentColor"
fill-rule="evenodd"
fillRule="evenodd"
/>
<path
d="M7.923 24.713H6.088a1.896 1.896 0 00-.206-.654 1.651 1.651 0 00-.96-.805 2.086 2.086 0 00-.682-.108 1.99 1.99 0 00-1.161.342c-.33.225-.585.554-.767.987-.181.43-.272.952-.272 1.566 0 .632.09 1.163.272 1.593.184.43.442.754.771.974.33.219.711.329 1.144.329.243 0 .468-.034.675-.1.21-.066.395-.163.557-.29.162-.13.296-.287.402-.472.11-.184.185-.395.227-.631l1.835.008a3.51 3.51 0 01-.356 1.177c-.187.375-.44.712-.759 1.009a3.548 3.548 0 01-1.131.7 4.04 4.04 0 01-1.48.256c-.765 0-1.45-.179-2.053-.537-.6-.357-1.075-.875-1.424-1.553-.347-.678-.52-1.5-.52-2.463 0-.966.176-1.789.528-2.467.352-.678.83-1.194 1.433-1.55.604-.357 1.282-.536 2.037-.536.497 0 .958.072 1.383.217a3.47 3.47 0 011.135.632c.33.274.598.61.805 1.008.21.398.343.854.402 1.368zM16.206 24.713h-1.835a1.897 1.897 0 00-.206-.654 1.652 1.652 0 00-.96-.805 2.086 2.086 0 00-.682-.108 1.99 1.99 0 00-1.16.342c-.33.225-.586.554-.768.987-.181.43-.272.952-.272 1.566 0 .632.09 1.163.272 1.593.185.43.442.754.771.974.33.219.711.329 1.144.329.243 0 .468-.034.675-.1.21-.066.395-.163.557-.29.162-.13.296-.287.402-.472.11-.184.185-.395.227-.631l1.835.008c-.047.407-.166.8-.356 1.177-.187.375-.44.712-.758 1.009a3.55 3.55 0 01-1.132.7 4.04 4.04 0 01-1.479.256c-.765 0-1.45-.179-2.053-.537-.6-.357-1.076-.875-1.425-1.553-.346-.678-.52-1.5-.52-2.463 0-.966.176-1.789.528-2.467.352-.678.83-1.194 1.434-1.55.603-.357 1.282-.536 2.036-.536.497 0 .958.072 1.383.217.427.144.806.355 1.135.632.33.274.598.61.805 1.008.21.398.344.854.402 1.368zM16.918 30.475V21.61h3.386c.65 0 1.205.129 1.663.386.458.253.808.607 1.048 1.06.243.45.364.97.364 1.558 0 .588-.123 1.108-.368 1.558-.246.45-.602.8-1.069 1.052-.464.25-1.025.376-1.684.376H18.1V26.1h1.864c.35 0 .637-.062.864-.186.229-.127.399-.301.51-.523.115-.226.172-.484.172-.775 0-.294-.057-.551-.171-.77a1.166 1.166 0 00-.511-.515c-.23-.125-.52-.187-.872-.187h-1.224v7.332h-1.814zM24.455 30.475h-1.944l2.962-8.864h2.338l2.959 8.864h-1.944l-2.15-6.838h-.067l-2.154 6.838zm-.121-3.484h4.592v1.463h-4.592V26.99z"
Expand Down
Loading
Loading