Skip to content
Open
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
3 changes: 3 additions & 0 deletions starter/hyv-guarded-blog/.eslintrc.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
{
"extends": "next/core-web-vitals"
}
40 changes: 40 additions & 0 deletions starter/hyv-guarded-blog/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.

# dependencies
/node_modules
/.pnp
.pnp.*
.yarn/*
!.yarn/patches
!.yarn/plugins
!.yarn/releases
!.yarn/versions

# testing
/coverage

# next.js
/.next/
/out/

# production
/build

# misc
.DS_Store
*.pem

# debug
npm-debug.log*
yarn-debug.log*
yarn-error.log*

# local env files
.env*.local

# vercel
.vercel

# typescript
*.tsbuildinfo
next-env.d.ts
54 changes: 54 additions & 0 deletions starter/hyv-guarded-blog/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
---
name: AI Voice Gate Blog Starter
slug: hyv-guarded-blog
description: A Next.js blog that fails its own build if posts sound like ChatGPT wrote them. Runs 100% locally, zero API calls.
framework: Next.js
useCase: Blog
css: Tailwind
publisher: Hold Your Voice
deployUrl: https://vercel.com/new/clone?repository-url=https://github.com/shashank-sn/hold-your-voice
demoUrl: https://hold-your-voice-vercel.vercel.app
relatedTemplates:
- blog-starter-kit
---

# a next.js blog that fails its own build if it sounds like chatgpt wrote it

```
hyv scan _posts/ai-slop-example.md

● line 16: ai.holistic — describe the actual approach
● line 16: ai.fast-paced — cut this — every industry says this
● line 16: ai.cut[t]?ing-edge — name the specific technology
● line 20: ai.paradigm — describe the actual shift
○ line 20: formula.firstly — just start — "firstly" is filler
○ line 24: ai.foster — use: build, grow, encourage, support
● line 32: ai.delve — use a specific verb: dig, explore, look at
● line 36: ai.ever-evolving — cut this — it says nothing
● line 36: formula.in-conclusion — just end. readers know it's the end.

34 issues (14 red, 20 yellow)
score: 0/100

exit code 2 -- build refused
```

prebuild runs `hyv scan` on every post with `--fail-on-hit`. exits 2 on any hit. vercel refuses the deploy.

## Demo

https://hold-your-voice-vercel.vercel.app

## Deploy your own

[![Deploy with Vercel](https://vercel.com/button)](https://vercel.com/new/clone?repository-url=https://github.com/shashank-sn/hold-your-voice)

## How to use

```bash
npx create-next-app --example https://github.com/shashank-sn/hold-your-voice hyv-guarded-blog
```

install it once: `npm i -g @holdyourvoice/hyv@latest`. runs 100% locally. zero api calls. free forever.

$1 first month → [holdyourvoice.com](https://holdyourvoice.com)
38 changes: 38 additions & 0 deletions starter/hyv-guarded-blog/_posts/ai-slop-example.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
---
title: "leveraging innovation for sustainable business growth"
excerpt: "explore key strategies for driving sustainable growth through innovation in the modern digital landscape"
description: "a comprehensive guide to implementing robust innovation frameworks that foster meaningful transformation and deliver tangible business results"
coverImage: "/assets/blog/hello-world/cover.jpg"
date: "2026-07-02T00:00:00.000Z"
author:
name: hold your voice
picture: "/assets/blog/authors/tim.jpeg"
ogImage:
url: "/assets/blog/hello-world/cover.jpg"
---

# Leveraging Innovation for Sustainable Business Growth

In today's fast-paced digital landscape, businesses must harness the power of innovation to stay ahead of the curve. The modern marketplace demands a holistic approach that seamlessly integrates cutting-edge technology with robust strategic frameworks.

## The Paradigm Shift

Firstly, it is important to note that the business environment has undergone a profound paradigm shift. Organizations that fail to adapt risk being left behind in an increasingly competitive ecosystem. Moreover, the convergence of artificial intelligence, data-driven decision making, and agile methodologies has created unprecedented opportunities for growth.

## Key Strategies for Success

To foster meaningful innovation, companies must embrace a multifaceted approach. This involves leveraging synergies across departments, optimizing workflows, and creating a culture of continuous improvement.

It is crucial to understand that innovation is not just about implementing new technologies. Rather, it encompasses a comprehensive transformation of organizational mindsets and processes. By empowering teams and encouraging cross-functional collaboration, businesses can unlock hidden potential.

## Driving Tangible Results

The implementation of robust innovation frameworks yields tangible outcomes. Organizations that prioritize digital transformation report significant improvements in efficiency, customer satisfaction, and bottom-line performance. These results underscore the importance of taking a proactive stance.

Let's delve into the specific ways innovation drives growth. Enhanced data analytics capabilities enable more informed decision-making. Streamlined operations reduce costs while improving quality. And perhaps most importantly, a forward-thinking approach helps businesses anticipate market shifts before they occur.

## Conclusion

In conclusion, the path to sustainable growth lies in embracing innovation as a core business function. By fostering a culture of creativity, investing in the right tools, and maintaining a relentless focus on execution, organizations can position themselves for long-term success in an ever-evolving landscape.

The future belongs to those who are willing to challenge conventional wisdom and push the boundaries of what is possible. Are you ready to take the first step?
28 changes: 28 additions & 0 deletions starter/hyv-guarded-blog/_posts/clean-example.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
---
title: "ship the ugly version first"
date: "2026-07-01T00:00:00.000Z"
excerpt: "stop rewriting and start publishing your work before it feels ready for anyone else to see"
description: "six months polishing a landing page that nobody saw taught me that volume beats perfection and the version you never ship always costs far more than the one you send out too early"
coverImage: "/assets/blog/hello-world/cover.jpg"
ogImage:
url: "/assets/blog/hello-world/cover.jpg"
author:
name: hold your voice
picture: "/assets/blog/authors/tim.jpeg"
---

# ship the ugly version first

I spent six months rewriting a landing page nobody ever saw.

The copy was fine. The design worked. I just convinced myself it needed to be cleaner, sharper, more "on brand." So the tab stayed open and I tweaked sentences instead of shipping.

Nobody remembers the version you shipped too early. Everyone remembers the thing you never shipped at all.

A first draft is a negotiation between your taste and what you can actually produce. Your taste is sharp. Your output, at the start, is not. Volume closes the gap. More writing, more shipping, more cringing at the old stuff.

"If you are embarrassed by the thing you built six months ago, you are moving at the right pace." A friend told me that. It stuck.

I follow a simple rule now. Ship when the thing works. Polish when someone complains. When nobody complains, you were already good enough.

Some projects deserve a three month rebrand. Others just need to exist. Ship accordingly.
31 changes: 31 additions & 0 deletions starter/hyv-guarded-blog/package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
{
"name": "hyv-guarded-blog",
"repository": "https://github.com/shashank-sn/hold-your-voice",
"license": "MIT",
"private": true,
"scripts": {
"dev": "next dev --turbopack",
"prebuild": "bash -c 'set -e; for f in _posts/*.md; do npx @holdyourvoice/hyv@latest scan \"$f\" --fail-on-hit --ignore voice.staccato-triplet; done'",
"build": "next build",
"start": "next start"
},
"dependencies": {
"classnames": "^2.5.1",
"date-fns": "^3.6.0",
"gray-matter": "^4.0.3",
"next": "^16.2.10",
"react": "^19",
"react-dom": "^19",
"remark": "^15.0.1",
"remark-html": "^16.0.1"
},
"devDependencies": {
"@types/node": "^20",
"@types/react": "^19",
"@types/react-dom": "^19",
"autoprefixer": "^10.4.19",
"postcss": "^8.4.38",
"tailwindcss": "^3.4.4",
"typescript": "^5.5.2"
}
}
6 changes: 6 additions & 0 deletions starter/hyv-guarded-blog/postcss.config.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
module.exports = {
plugins: {
tailwindcss: {},
autoprefixer: {},
},
};
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
9 changes: 9 additions & 0 deletions starter/hyv-guarded-blog/public/favicon/browserconfig.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
<?xml version="1.0" encoding="utf-8"?>
<browserconfig>
<msapplication>
<tile>
<square150x150logo src="/favicons/mstile-150x150.png"/>
<TileColor>#000000</TileColor>
</tile>
</msapplication>
</browserconfig>
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file not shown.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
33 changes: 33 additions & 0 deletions starter/hyv-guarded-blog/public/favicon/safari-pinned-tab.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
19 changes: 19 additions & 0 deletions starter/hyv-guarded-blog/public/favicon/site.webmanifest
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
{
"name": "Next.js",
"short_name": "Next.js",
"icons": [
{
"src": "/favicons/android-chrome-192x192.png",
"sizes": "192x192",
"type": "image/png"
},
{
"src": "/favicons/android-chrome-512x512.png",
"sizes": "512x512",
"type": "image/png"
}
],
"theme_color": "#000000",
"background_color": "#000000",
"display": "standalone"
}
48 changes: 48 additions & 0 deletions starter/hyv-guarded-blog/src/app/_components/alert.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
import Container from "@/app/_components/container";
import { EXAMPLE_PATH } from "@/lib/constants";
import cn from "classnames";

type Props = {
preview?: boolean;
};

const Alert = ({ preview }: Props) => {
return (
<div
className={cn("border-b dark:bg-slate-800", {
"bg-neutral-800 border-neutral-800 text-white": preview,
"bg-neutral-50 border-neutral-200": !preview,
})}
>
<Container>
<div className="py-2 text-center text-sm">
{preview ? (
<>
This page is a preview.{" "}
<a
href="/api/exit-preview"
className="underline hover:text-teal-300 duration-200 transition-colors"
>
Click here
</a>{" "}
to exit preview mode.
</>
) : (
<>
The source code for this blog is{" "}
<a
href={`https://github.com/vercel/next.js/tree/canary/examples/${EXAMPLE_PATH}`}
className="underline hover:text-blue-600 duration-200 transition-colors"
>
available on GitHub
</a>
.
</>
)}
</div>
</Container>
</div>
);
};

export default Alert;
15 changes: 15 additions & 0 deletions starter/hyv-guarded-blog/src/app/_components/avatar.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
type Props = {
name: string;
picture: string;
};

const Avatar = ({ name, picture }: Props) => {
return (
<div className="flex items-center">
<img src={picture} className="w-12 h-12 rounded-full mr-4" alt={name} />
<div className="text-xl font-bold">{name}</div>
</div>
);
};

export default Avatar;
9 changes: 9 additions & 0 deletions starter/hyv-guarded-blog/src/app/_components/container.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
type Props = {
children?: React.ReactNode;
};

const Container = ({ children }: Props) => {
return <div className="container mx-auto px-5">{children}</div>;
};

export default Container;
36 changes: 36 additions & 0 deletions starter/hyv-guarded-blog/src/app/_components/cover-image.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
import cn from "classnames";
import Link from "next/link";
import Image from "next/image";

type Props = {
title: string;
src: string;
slug?: string;
};

const CoverImage = ({ title, src, slug }: Props) => {
const image = (
<Image
src={src}
alt={`Cover Image for ${title}`}
className={cn("shadow-sm w-full", {
"hover:shadow-lg transition-shadow duration-200": slug,
})}
width={1300}
height={630}
/>
);
return (
<div className="sm:mx-0">
{slug ? (
<Link href={`/posts/${slug}`} aria-label={title}>
{image}
</Link>
) : (
image
)}
</div>
);
};

export default CoverImage;
12 changes: 12 additions & 0 deletions starter/hyv-guarded-blog/src/app/_components/date-formatter.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
import { parseISO, format } from "date-fns";

type Props = {
dateString: string;
};

const DateFormatter = ({ dateString }: Props) => {
const date = parseISO(dateString);
return <time dateTime={dateString}>{format(date, "LLLL d, yyyy")}</time>;
};

export default DateFormatter;
Loading