Skip to content

Instantly share code, notes, and snippets.

@jiggyjo11
Created September 29, 2025 15:26
Show Gist options
  • Select an option

  • Save jiggyjo11/8c8e6173fa70aa6362e8711372f79480 to your computer and use it in GitHub Desktop.

Select an option

Save jiggyjo11/8c8e6173fa70aa6362e8711372f79480 to your computer and use it in GitHub Desktop.
import { z } from "zod";
// Section 1: Project
export const section1Schema = z.object({
projectType: z.enum(["agent", "research", "dao", "infra", "other"]),
projectName: z.string().min(2, "Project name must be at least 2 characters"),
oneLiner: z.string().min(10, "One liner must be at least 10 characters"),
leadName: z.string().min(2, "Lead name must be at least 2 characters"),
email: z.string().email("Please provide a valid email address"),
primaryProfileUrl: z.string().url("Please provide a valid URL"),
pitchDeckPath: z.string().optional(),
});
// Section 2: Thesis & Problem-Fit
export const section2Schema = z.object({
problem: z.string().min(50, "Please provide a detailed problem description"),
solutionEdge: z.string().min(50, "Please describe your solution and competitive edge"),
frontier: z.string().min(30, "Please describe the frontier you're pushing"),
vision10y: z.string().min(30, "Please describe your 10-year vision"),
});
// Section 3: Team & Execution
export const section3Schema = z.object({
coreTeam: z.array(z.object({
name: z.string().min(2, "Name is required"),
role: z.string().min(2, "Role is required"),
profileUrl: z.string().url().optional().or(z.literal("")),
})).min(1, "At least one team member is required"),
cohesion: z.string().min(30, "Please describe team cohesion"),
proofAgency: z.string().min(30, "Please provide proof of agency"),
proofVelocityLink: z.string().url("Please provide a valid URL").optional().or(z.literal("")),
traction: z.string().min(20, "Please describe your traction"),
});
// Section 4: Economics & Moat
export const section4Schema = z.object({
tam: z.string().min(5, "Please provide TAM information"),
moat: z.string().min(30, "Please describe your moat"),
valueAccrual: z.string().min(30, "Please describe value accrual"),
fundingStatus: z.string().min(10, "Please provide funding status"),
});
// Section 5: Web3 / On-Chain
export const section5Schema = z.object({
onchainIdentity: z.string().min(3, "Please provide ENS or address"),
web3Contribution: z.string().min(30, "Please describe your Web3 contribution"),
launchEta: z.string().min(3, "Please provide launch ETA"),
});
// Section 6: Supporting Evidence
export const section6Schema = z.object({
whitepaperPath: z.string().optional(),
financialsPath: z.string().optional(),
otherDocPath: z.string().optional(),
finalWord: z.string().optional(),
});
// Section 7: Bio App Page
export const section7Schema = z.object({
category: z.string().min(1, "Please select a category"),
logoPath: z.string().optional(),
headerImagePath: z.string().optional(),
xUrl: z.string().optional().refine((val) => !val || z.string().url().safeParse(val).success, "Please provide a valid URL"),
discordUrl: z.string().optional().refine((val) => !val || z.string().url().safeParse(val).success, "Please provide a valid URL"),
websiteUrl: z.string().optional().refine((val) => !val || z.string().url().safeParse(val).success, "Please provide a valid URL"),
linkedinUrl: z.string().optional().refine((val) => !val || z.string().url().safeParse(val).success, "Please provide a valid URL"),
onePagerPath: z.string().optional(),
marketOverview: z.string().min(50, "Please provide detailed market metrics"),
roadmap: z.string().min(100, "Please provide 4-8 key milestones with format specified"),
recommendReading: z.string().min(20, "Please provide 3-6 foundational reference URLs"),
});
// Combined draft type
export type Draft = {
section1?: z.infer<typeof section1Schema>;
section2?: z.infer<typeof section2Schema>;
section3?: z.infer<typeof section3Schema>;
section4?: z.infer<typeof section4Schema>;
section5?: z.infer<typeof section5Schema>;
section6?: z.infer<typeof section6Schema>;
section7?: z.infer<typeof section7Schema>;
};
// Full application schema (for final submission)
export const fullApplicationSchema = z.object({
section1: section1Schema,
section2: section2Schema,
section3: section3Schema,
section4: section4Schema,
section5: section5Schema,
section6: section6Schema,
section7: section7Schema,
});
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment