blog: seed round announcement (#3168)

* init

* cleanup

* fix seed round announcemnt

* fix seed round announcemnt

* seed round blog

* add nav mobile

* fix typo

* Update docs/content/blogs/seed-round.mdx

Co-authored-by: cubic-dev-ai[bot] <191113872+cubic-dev-ai[bot]@users.noreply.github.com>

* Update docs/app/blog/[[...slug]]/page.tsx

Co-authored-by: cubic-dev-ai[bot] <191113872+cubic-dev-ai[bot]@users.noreply.github.com>

* Update docs/app/blog/[[...slug]]/page.tsx

Co-authored-by: cubic-dev-ai[bot] <191113872+cubic-dev-ai[bot]@users.noreply.github.com>

* update og

* cleanup

---------

Co-authored-by: cubic-dev-ai[bot] <191113872+cubic-dev-ai[bot]@users.noreply.github.com>
This commit is contained in:
Bereket Engida
2025-06-25 12:32:01 -04:00
committed by GitHub
parent 048914fbaf
commit 1d35c64e6b
10 changed files with 106 additions and 37 deletions

View File

@@ -22,6 +22,7 @@ import { BookIcon, GitHubIcon, XIcon } from "../_components/icons";
import { DiscordLogoIcon } from "@radix-ui/react-icons";
import { StarField } from "../_components/stat-field";
import Image from "next/image";
import { BlogPage } from "../_components/blog-list";
const metaTitle = "Blogs";
const metaDescription = "Latest changes , fixes and updates.";
@@ -33,6 +34,9 @@ export default async function Page({
params: Promise<{ slug?: string[] }>;
}) {
const { slug } = await params;
if (!slug) {
return <BlogPage />;
}
const page = blogs.getPage(slug);
if (!page) {
notFound();
@@ -47,8 +51,9 @@ export default async function Page({
<Glow />
<div className="flex flex-col md:justify-center max-w-xl mx-auto h-full">
<Link href="/blog" className="text-gray-600 dark:text-gray-300">
<div className="flex flex-col">
<div className="flex items-center cursor-pointer gap-x-2 text-xs w-full border-b border-white/20">
<div className="flex items-center cursor-pointer gap-x-2 text-xs w-full border-white/20">
<svg
xmlns="http://www.w3.org/2000/svg"
width="2.5em"
@@ -66,6 +71,7 @@ export default async function Page({
{title}{" "}
</h1>
</div>
</Link>
<p className="text-gray-600 dark:text-gray-300">{description}</p>
<div className="text-gray-600 text-sm dark:text-gray-400 flex items-center gap-x-1 text-left">
@@ -185,7 +191,11 @@ export async function generateMetadata({
const page = blogs.getPage(slug);
if (page == null) notFound();
const baseUrl = process.env.NEXT_PUBLIC_URL || process.env.VERCEL_URL;
const url = new URL(`${baseUrl}/release-og/${slug.join("")}.png`);
const url = new URL(
`${baseUrl?.startsWith("http") ? baseUrl : `https://${baseUrl}`}${
page.data?.image
}`,
);
const { title, description } = page.data;
return {
@@ -195,7 +205,7 @@ export async function generateMetadata({
title,
description,
type: "website",
url: absoluteUrl(`blogs/${slug.join("")}`),
url: absoluteUrl(`blog/${slug.join("/")}`),
images: [
{
url: url.toString(),

View File

@@ -1,15 +1,14 @@
import { formatBlogDate } from "@/lib/blog";
import Link from "next/link";
import { blogs } from "@/lib/source";
import { IconLink } from "../blog/_components/changelog-layout";
import { GitHubIcon, BookIcon, XIcon } from "../blog/_components/icons";
import { Glow } from "../blog/_components/default-changelog";
import { StarField } from "../blog/_components/stat-field";
import { IconLink } from "./changelog-layout";
import { GitHubIcon, BookIcon, XIcon } from "./icons";
import { Glow } from "./default-changelog";
import { StarField } from "./stat-field";
import { DiscordLogoIcon } from "@radix-ui/react-icons";
export default async function BlogPage() {
export async function BlogPage() {
const posts = blogs.getPages();
return (
<div className="md:grid md:grid-cols-2 items-start">
<div className="bg-gradient-to-tr hidden md:block overflow-hidden px-12 py-24 md:py-0 -mt-[100px] md:h-dvh relative md:sticky top-0 from-transparent dark:via-stone-950/5 via-stone-100/30 to-stone-200/20 dark:to-transparent/10">

View File

@@ -34,24 +34,22 @@ export default async function HomePage() {
<div className="flex flex-col md:flex-row items-center justify-center h-12">
<span className="font-medium flex gap-2 text-sm text-zinc-700 dark:text-zinc-300">
<span className=" text-zinc-900 dark:text-white/90 hover:text-zinc-950 text-xs md:text-sm dark:hover:text-zinc-100 transition-colors">
Introducing{" "}
<span className="font-semibold">
Better Auth Infrastructure
</span>
Announcing Our{" "}
<span className="font-semibold">$5M seed round</span>
</span>
<span className=" text-zinc-400 hidden md:block">|</span>
<Link
href="https://better-auth.build"
href="/blog/seed-round"
className="font-semibold text-blue-600 dark:text-blue-400 hover:text-blue-700 hidden dark:hover:text-blue-300 transition-colors md:block"
>
Join the waitlist
Read more
</Link>
</span>
<Link
href="https://better-auth.build"
href="/blog/seed-round"
className="font-semibold text-blue-600 dark:text-blue-400 hover:text-blue-700 text-xs dark:hover:text-blue-300 transition-colors md:hidden"
>
Join the waitlist
Read more
</Link>
</div>
</div>

View File

@@ -120,6 +120,10 @@ export const navMenu = [
name: "changelogs",
path: "/changelogs",
},
{
name: "blogs",
path: "/blog",
},
{
name: "community",
path: "/community",

View File

@@ -217,6 +217,10 @@ export const navMenu: {
name: "changelogs",
path: "/changelogs",
},
{
name: "blogs",
path: "/blog",
},
{
name: "community",
path: "/community",

View File

@@ -0,0 +1,35 @@
---
title: "Announcing our $5M seed round"
description: "We raised $5M seed led by Peak XV Partners"
date: 2025-06-24
author:
name: "Bereket Engida"
avatar: "/blogs/bereket.png"
twitter: "john_doe"
image: "/blogs/seed-round.png"
tags: ["seed round", "authentication", "funding"]
---
## Announcing our $5M seed round
Were excited to share that Better Auth has raised a $5 million seed round led by Peak XV Partners (formerly Sequoia Capital India & SEA), with participation from Y Combinator, Chapter One, P1 Ventures, and a group of incredible investors and angels.
This funding fuels the next phase of **Better Auth**.
From the start we are obsessed with making it possible for developers to **own their auth**. To **democratize high quality authentication** and make rolling your own auth not just doable, but the obvious choice.
It started with building the framework. Since then, weve seen incredible growth and support from the community. Thank you everyone for being part of this journey. Its still early days, and theres so much more to build. This funding will allow us to have more people invloved and to push the boundaries of what's possible.
On top of the framework, were also building the infrastructure to cover the gaps we couldn't cover in the framework:
* A unified dashboard to manage users and user analytics
* Enterprise-grade security: bot, abuse, and fraud protection
* Authentication Email and SMS service
* Fast, globally distributed session storage
* and more.
[Join the waitlist](https://better-auth.build) to get early access to the infrastructure.
And if you're excited about making auth accessible - we're hiring!
Reach out to [jobs@better-auth.com](mailto:jobs@better-auth.com).

Binary file not shown.

After

Width:  |  Height:  |  Size: 77 KiB

View File

@@ -1,4 +1,4 @@
import type { BetterAuthPlugin } from "../types";
import type { BetterAuthOptions, BetterAuthPlugin } from "../types";
import type { BetterAuthClientPlugin } from "./types";
export * from "./vanilla";
export * from "./query";
@@ -11,6 +11,10 @@ export const InferPlugin = <T extends BetterAuthPlugin>() => {
} satisfies BetterAuthClientPlugin;
};
export function InferAuth<O extends { options: BetterAuthOptions }>() {
return {} as O["options"];
}
//@ts-expect-error
export type * from "nanostores";
export type * from "@better-fetch/fetch";

View File

@@ -12,7 +12,7 @@ import type {
} from "../types/helper";
import type { Auth } from "../auth";
import type { InferRoutes } from "./path-to-object";
import type { Session, User } from "../types";
import type { BetterAuthOptions, Session, User } from "../types";
import type { InferFieldsInputClient, InferFieldsOutput } from "../db";
export type AtomListener = {
@@ -72,6 +72,7 @@ export interface ClientOptions {
baseURL?: string;
basePath?: string;
disableDefaultFetchPlugins?: boolean;
$InferAuth?: BetterAuthOptions;
}
export type InferClientAPI<O extends ClientOptions> = InferRoutes<

View File

@@ -16,6 +16,7 @@ import type {
BetterFetchResponse,
} from "@better-fetch/fetch";
import type { BASE_ERROR_CODES } from "../error/codes";
import type { InferRoutes } from "./path-to-object";
type InferResolvedHooks<O extends ClientOptions> = O["plugins"] extends Array<
infer Plugin
@@ -89,5 +90,18 @@ export function createAuthClient<Option extends ClientOptions>(
$ERROR_CODES: PrettifyDeep<
InferErrorCodes<Option> & typeof BASE_ERROR_CODES
>;
};
} & InferRoutes<
Option["$InferAuth"] extends {
plugins: infer Plugins;
}
? Plugins extends Array<infer Plugin>
? Plugin extends {
endpoints: infer Endpoints;
}
? Endpoints
: {}
: {}
: {},
Option
>;
}