BlinkShot: a real-time image generator built to be cloned, not deployed
A realtime AI image generator
At a glance
- What is it?
- An open source Next.js image generator that streams Juggernaut Lightning Flux output through Together AI, with Braintrust tracing and Upstash rate limiting. Its README is candid about what is still on the to-do list.
- Who is it for?
- BlinkShot is best read as a reference implementation of a streaming image generator rather than a service you would point users at. The plumbing is the point: a two-step Flux model behind a server-sent event stream, traced through Braintrust, rate limited through Upstash, with model and observability checks wired into package scripts so a misconfiguration surfaces as a failed verify rather than a blank image.
- Can I use it commercially?
- Not without permission. GitHub finds no licence file in the repository, and without a licence all rights are reserved by default: you may read the code but not reuse it. Check the README, or ask the authors, before using it.
- Is it still maintained?
- Yes. The repository last received commits 42 days ago.
- What is it written in?
- Mainly TypeScript, according to GitHub's language statistics.
Answers come from the project's GitHub data, last synced on October 11, 2026, and from our analysis. They are not legal advice.
Editorial analysis
What the repository actually contains
BlinkShot is a Next.js app with a small, conventional tree: `app/` for routes, `components/`, `hooks/`, `lib/`, `public/`, and a `scripts/` directory that matters more than its size suggests. Configuration lives in `next.config.mjs`, `tailwind.config.ts` and `postcss.config.mjs`, with `eslint.config.mjs` and `components.json` for the component layer. The package manager is pnpm, and `pnpm-lock.yaml` is committed alongside `package.json`.
Two root files are worth noticing because they are unusual for a demo. `proxy.ts` sits at the top level rather than inside the app directory, and `.example.env` is checked in as a template.
The project has 1,039 stars and 191 forks with zero open issues, and it is not archived. The last push was on 2026-08-31. There are no releases and no version tags, so the `version` field in `package.json` reads `0.1.0` and the project is marked `private`, which for a Next.js app means private to npm rather than closed source.
The homepage is blinkshot.io, which is the hosted version built from this code.
Getting it running takes one API key
The README's setup section is three numbered steps, and the first two are about credentials rather than tooling.
git clone https://github.com/Nutlope/blinkshotThen create a `.env.local` file and add your Together AI API key, then run `npm install` and `npm run dev` to install dependencies and run locally. The `.example.env` file in the tree is the template for that environment file.
That is the entire dependency on an external service. There is no database, no object storage and no queue. Images are produced by a model and streamed to the browser, and the persistence problem is unsolved, which the README confirms by listing a download button as unfinished work.
The test and verification scripts are where this repo is more rigorous than a typical demo. Alongside the standard `dev`, `build`, `start` and `lint` scripts, `package.json` defines a test script that runs `tsx` against `lib/**/*.test.ts`, and two verify scripts: one for Braintrust traces and one for the model catalog.
A two-step Flux model behind an event stream
The model choice is specific and the README says why. BlinkShot is powered by Juggernaut Lightning Flux from RunDiffusion, served through Together AI. The Together AI link in the README carries referral parameters, which is worth noting as a fact about the project's incentives rather than an accusation about the code.
Lightning Flux is a distilled few-step model, and the README's future list confirms this by including a setting to select between 2 and 5 steps. Fewer steps is the entire reason a generator can feel instant, so this is the parameter that determines whether the app feels real-time or feels like a loading screen. It is not implemented yet, which means the current latency profile is whatever the default step count gives you.
The dependency list in `package.json` tells you more about the stack than the README does. It includes `@radix-ui/react-*` primitives for dialogs, selects, radio groups and switches, `@tanstack/react-query` for server state, `embla-carousel-react` for carousel behaviour, `lucide-react` for icons, `react-hot-toast` for notifications, and `@upstash/redis` with `@upstash/ratelimit` for distributed rate limiting. Versions are current: Next 16.2.6, React 18, Tailwind merge 2.5.
Two entries are easy to skim past. `server-only` is a dependency, which is the package that throws if a module marked server-only is imported into client code, so image generation is deliberately kept off the client bundle. And `dedent` is present, which is a hint that prompts are stored as template literals rather than string concatenation.
Tracing every generation with Braintrust
BlinkShot integrates Braintrust for image-generation tracing and observability, and treats it as a first-class concern rather than an afterthought. The `braintrust` package sits at 3.21.0 in the dependencies, and there is a dedicated verification script, `verify:braintrust`, whose only job is to check that a trace can be produced.
Having a script that verifies observability separately is the detail worth taking seriously. Most projects that claim tracing never prove the trace arrives. A verify script means a misconfigured key or a renamed export breaks a check rather than silently producing a working-looking app with no data behind it.
The same instinct shows up in `verify:models`, which checks the model catalog. Together the two scripts cover the two things most likely to break invisibly in an app whose entire visible output is an image: the model list going stale, and the trace pipeline going quiet.
Analytics are handled separately by Plausible, wired in through `next-plausible`. The split between Braintrust for backend traces and Plausible for page views is a normal division of labour, though it does mean two third-party services are involved in running your own instance.
The future task list is a product spec
The README ends with six unchecked tasks, and reading them as a group tells you what a real deployment would need beyond this code.
The first is a download button, so people can get their images, which means image persistence that does not exist today. The second is auth and rate limiting by email instead of IP, which changes the `@upstash/ratelimit` key from an address to an identity. The third is showing users how many credits they have left, which implies a billing model that does not exist. The fourth is an image gallery of generations with their prompts, which implies storing both.
The last two are more technical. Replay functionality, so people can replay consistent generations, means storing enough state to reconstruct a seed and sampler setup. And a setting to select between steps, 2 to 5, is the latency control described earlier.
Read together, the gaps are consistent: the repository has the streaming pipeline and nothing around it. There is no account, no storage and no quota. That is a coherent thing to publish, since it is a reference implementation rather than a product, but it does mean anyone who clones this is starting from the middle of the stack.
The `husky` and linting setup suggest the project intends contributors, and the `components.json` file indicates shadcn-style components are part of the house style, though the README does not spell out the component conventions in prose.
Editorial conclusion
BlinkShot is best read as a reference implementation of a streaming image generator rather than a service you would point users at. The plumbing is the point: a two-step Flux model behind a server-sent event stream, traced through Braintrust, rate limited through Upstash, with model and observability checks wired into package scripts so a misconfiguration surfaces as a failed verify rather than a blank image. What it does not have is everything on its own future list, including a download button, email-based limits, credit display and a prompt gallery, so running your own deployment means writing that layer. The repo is not archived and the last push was 2026-08-31, so the dependency list will move. Start by cloning it, adding a `TOGETHER_API_KEY` to `.env.local`, and running `npm run dev` to see the stream behave before deciding what to build on top.
Frequently asked questions
What model does BlinkShot use to generate images?
Juggernaut Lightning Flux from RunDiffusion, served through Together AI. The README notes that adding a control for 2 to 5 steps is still an open task, which is the main latency lever for a distilled model.
How do I run BlinkShot locally?
Clone the repository, create a `.env.local` file containing your Together AI key as `TOGETHER_API_KEY`, then run `npm install` and `npm run dev`. An `.example.env` template is included in the repository root.
Does BlinkShot need a database to store generated images?
No, and that is a known limitation rather than an oversight. A download button is listed as an unfinished task, so images currently exist only for the session that generated them.
What is Braintrust used for in BlinkShot?
Image-generation tracing and observability. The package is a direct dependency and a `verify:braintrust` script exists specifically to confirm traces are being produced, so the observability path is checked rather than assumed.
How does BlinkShot rate limit its users?
By IP address, using `@upstash/redis` and `@upstash/ratelimit`. Moving to auth with rate limiting by email instead of IP is listed as a future task.
Official sources
Add this badge to your README
If you maintain this project, the badge below links readers to this analysis and shows its maintenance status from the daily GitHub snapshot. Paste the markdown into your README; add ?metric=license or ?metric=stars to the image URL for a different field.
[](https://hysenlabs.com/projects/nutlope-blinkshot)