mirror of
https://github.com/LukeHagar/better-auth.git
synced 2025-12-10 04:19:32 +00:00
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:
@@ -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,25 +51,27 @@ export default async function Page({
|
||||
<Glow />
|
||||
|
||||
<div className="flex flex-col md:justify-center max-w-xl mx-auto h-full">
|
||||
<div className="flex flex-col">
|
||||
<div className="flex items-center cursor-pointer gap-x-2 text-xs w-full border-b border-white/20">
|
||||
<svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
width="2.5em"
|
||||
height="2.5em"
|
||||
className="rotate-180"
|
||||
viewBox="0 0 24 24"
|
||||
>
|
||||
<path
|
||||
fill="currentColor"
|
||||
d="M2 13v-2h16.172l-3.95-3.95l1.414-1.414L22 12l-6.364 6.364l-1.414-1.414l3.95-3.95z"
|
||||
></path>
|
||||
</svg>
|
||||
<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-white/20">
|
||||
<svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
width="2.5em"
|
||||
height="2.5em"
|
||||
className="rotate-180"
|
||||
viewBox="0 0 24 24"
|
||||
>
|
||||
<path
|
||||
fill="currentColor"
|
||||
d="M2 13v-2h16.172l-3.95-3.95l1.414-1.414L22 12l-6.364 6.364l-1.414-1.414l3.95-3.95z"
|
||||
></path>
|
||||
</svg>
|
||||
</div>
|
||||
<h1 className="mt-2 relative font-sans font-semibold tracking-tighter text-4xl mb-2 border-dashed">
|
||||
{title}{" "}
|
||||
</h1>
|
||||
</div>
|
||||
<h1 className="mt-2 relative font-sans font-semibold tracking-tighter text-4xl mb-2 border-dashed">
|
||||
{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(),
|
||||
|
||||
@@ -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">
|
||||
@@ -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>
|
||||
|
||||
@@ -120,6 +120,10 @@ export const navMenu = [
|
||||
name: "changelogs",
|
||||
path: "/changelogs",
|
||||
},
|
||||
{
|
||||
name: "blogs",
|
||||
path: "/blog",
|
||||
},
|
||||
{
|
||||
name: "community",
|
||||
path: "/community",
|
||||
|
||||
@@ -217,6 +217,10 @@ export const navMenu: {
|
||||
name: "changelogs",
|
||||
path: "/changelogs",
|
||||
},
|
||||
{
|
||||
name: "blogs",
|
||||
path: "/blog",
|
||||
},
|
||||
{
|
||||
name: "community",
|
||||
path: "/community",
|
||||
|
||||
35
docs/content/blogs/seed-round.mdx
Normal file
35
docs/content/blogs/seed-round.mdx
Normal 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
|
||||
|
||||
We’re 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, we’ve seen incredible growth and support from the community. Thank you everyone for being part of this journey. It’s still early days, and there’s 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, we’re 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).
|
||||
BIN
docs/public/blogs/seed-round.png
Normal file
BIN
docs/public/blogs/seed-round.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 77 KiB |
@@ -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";
|
||||
|
||||
@@ -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<
|
||||
|
||||
@@ -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
|
||||
>;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user