AI-slop-mastery
AI-assisted coding
The workflow
1) Context is king
- Problem: The more context you feed to your agent, the worse it performs. Keep context small.
- Solution: Use
/compactto compact and summarize your conversation history in claude code, or just prompt the AI to summarize the entire conversation history and put that into a markdown file, which you can then feed as context into a new chat.
2) Write E2E tests
End to end tests will give you the biggest bang for your buck.
3) Review every line of code
No excuses. If you didn't write it, then review it.
4) Abstract first
LLMs perform better when there is some sort of structure in your coding, for example, using TS or building abstractions in simple interfaces on top of third-party libraries will help the AI to understand your coding style, and it will build off of that.
5) Actually doing it
- Create a
features.mdto track features, describe them, and cross them off incrementally. - Always ask the agent to plan through solving a feature before implementing it.
- Always use a living document for features, saving progress you made on a feature and describing it so you can feed it as context even when starting a brand new convo.
Summary
-
Plan First: Never let the AI code without a
plan.md. Read the plan. If the plan is wrong, the code will be wrong. -
Give it Eyes (Harnesses): The AI cannot see the UI. Give it a
dry-runscript or anpm testso it can "see" if it broke something. -
Review is Mandatory: AI is not a replacement for knowing how to code. It is a replacement for typing. You must review every line (or use tools like Graphite/CodeRabbit for a second opinion).
Model agnostic inference
Some platforms like Cursor or Warp allow you to BYOK or BYOM (bring your own model), where you need to specify these three pieces of information in order to run model inference:
- model endpoint: something like
https://opencode.ai/zen/v1/chat/completionswhich is the REST API endpoint for running inference on a specific model provider. - API key: the API key for the provider
- model tag: the specific model identifier to user, like
deepseek-v4-flash-free.
Here are the different endpoint families:
/v1/responses: for newer GPT models/v1/chat/completions: works with all openAI compatible endpoints/v1/messages: works only with Anthropic family models.
Inference with Opencode Zen
The endpoint URL is https://opencode.ai/zen/v1, with the OpenAI-compatible inference endpoint being https://opencode.ai/zen/v1/chat/completions.
Here are the general endpoints:
https://opencode.ai/zen/v1/models: returns list of all models hosted on OpenCode ZEN
Opencode free models
| Model name | Model identifier | Model inference endpoint |
|---|---|---|
| Big Pickle | big-pickle | https://opencode.ai/zen/v1/chat/completions |
| MiMo-V2.5 Free | mimo-v2.5-free | https://opencode.ai/zen/v1/chat/completions |
| North Mini Code Free | north-mini-code-free | https://opencode.ai/zen/v1/chat/completions |
| Nemotron 3 Ultra Free | nemotron-3-ultra-free | https://opencode.ai/zen/v1/chat/completions |
| DeepSeek V4 Flash Free | deepseek-v4-flash-free | https://opencode.ai/zen/v1/chat/completions |
All open code models
You can also access our models through the following API endpoints.
| Model | Model ID | Endpoint | AI SDK Package |
|---|---|---|---|
| GPT 6 Astra | gpt-6-astra | https://opencode.ai/zen/v1/responses | @ai-sdk/openai |
| GPT 5.6 Sol | gpt-5.6-sol | https://opencode.ai/zen/v1/responses | @ai-sdk/openai |
| GPT 5.6 Terra | gpt-5.6-terra | https://opencode.ai/zen/v1/responses | @ai-sdk/openai |
| GPT 5.6 Luna | gpt-5.6-luna | https://opencode.ai/zen/v1/responses | @ai-sdk/openai |
| GPT 5.5 | gpt-5.5 | https://opencode.ai/zen/v1/responses | @ai-sdk/openai |
| GPT 5.5 Pro | gpt-5.5-pro | https://opencode.ai/zen/v1/responses | @ai-sdk/openai |
| GPT 5.4 | gpt-5.4 | https://opencode.ai/zen/v1/responses | @ai-sdk/openai |
| GPT 5.4 Pro | gpt-5.4-pro | https://opencode.ai/zen/v1/responses | @ai-sdk/openai |
| GPT 5.4 Mini | gpt-5.4-mini | https://opencode.ai/zen/v1/responses | @ai-sdk/openai |
| GPT 5.4 Nano | gpt-5.4-nano | https://opencode.ai/zen/v1/responses | @ai-sdk/openai |
| GPT 5.3 Codex | gpt-5.3-codex | https://opencode.ai/zen/v1/responses | @ai-sdk/openai |
| GPT 5.3 Codex Spark | gpt-5.3-codex-spark | https://opencode.ai/zen/v1/responses | @ai-sdk/openai |
| GPT 5.2 | gpt-5.2 | https://opencode.ai/zen/v1/responses | @ai-sdk/openai |
| GPT 5.2 Codex | gpt-5.2-codex | https://opencode.ai/zen/v1/responses | @ai-sdk/openai |
| GPT 5.1 | gpt-5.1 | https://opencode.ai/zen/v1/responses | @ai-sdk/openai |
| GPT 5.1 Codex | gpt-5.1-codex | https://opencode.ai/zen/v1/responses | @ai-sdk/openai |
| GPT 5.1 Codex Max | gpt-5.1-codex-max | https://opencode.ai/zen/v1/responses | @ai-sdk/openai |
| GPT 5.1 Codex Mini | gpt-5.1-codex-mini | https://opencode.ai/zen/v1/responses | @ai-sdk/openai |
| GPT 5 | gpt-5 | https://opencode.ai/zen/v1/responses | @ai-sdk/openai |
| GPT 5 Codex | gpt-5-codex | https://opencode.ai/zen/v1/responses | @ai-sdk/openai |
| GPT 5 Nano | gpt-5-nano | https://opencode.ai/zen/v1/responses | @ai-sdk/openai |
| Claude Fable 5.1 | claude-fable-5-1 | https://opencode.ai/zen/v1/messages | @ai-sdk/anthropic |
| Claude Fable 5 | claude-fable-5 | https://opencode.ai/zen/v1/messages | @ai-sdk/anthropic |
| Claude Opus 5 | claude-opus-5 | https://opencode.ai/zen/v1/messages | @ai-sdk/anthropic |
| Claude Opus 4.8 | claude-opus-4-8 | https://opencode.ai/zen/v1/messages | @ai-sdk/anthropic |
| Claude Opus 4.7 | claude-opus-4-7 | https://opencode.ai/zen/v1/messages | @ai-sdk/anthropic |
| Claude Opus 4.6 | claude-opus-4-6 | https://opencode.ai/zen/v1/messages | @ai-sdk/anthropic |
| Claude Opus 4.5 | claude-opus-4-5 | https://opencode.ai/zen/v1/messages | @ai-sdk/anthropic |
| Claude Sonnet 5 | claude-sonnet-5 | https://opencode.ai/zen/v1/messages | @ai-sdk/anthropic |
| Claude Sonnet 4.6 | claude-sonnet-4-6 | https://opencode.ai/zen/v1/messages | @ai-sdk/anthropic |
| Claude Sonnet 4.5 | claude-sonnet-4-5 | https://opencode.ai/zen/v1/messages | @ai-sdk/anthropic |
| Claude Haiku 4.5 | claude-haiku-4-5 | https://opencode.ai/zen/v1/messages | @ai-sdk/anthropic |
| Gemini 3.8 Flash | gemini-3.8-flash | https://opencode.ai/zen/v1/models/gemini-3.8-flash | @ai-sdk/google |
| Gemini 3.7 Flash | gemini-3.7-flash | https://opencode.ai/zen/v1/models/gemini-3.7-flash | @ai-sdk/google |
| Gemini 3.6 Flash | gemini-3.6-flash | https://opencode.ai/zen/v1/models/gemini-3.6-flash | @ai-sdk/google |
| Gemini 3.5 Flash | gemini-3.5-flash | https://opencode.ai/zen/v1/models/gemini-3.5-flash | @ai-sdk/google |
| Gemini 3.5 Flash Lite | gemini-3.5-flash-lite | https://opencode.ai/zen/v1/models/gemini-3.5-flash-lite | @ai-sdk/google |
| Gemini 3.1 Pro | gemini-3.1-pro | https://opencode.ai/zen/v1/models/gemini-3.1-pro | @ai-sdk/google |
| Gemini 3 Flash | gemini-3-flash | https://opencode.ai/zen/v1/models/gemini-3-flash | @ai-sdk/google |
| Grok 4.6 | grok-4.6 | https://opencode.ai/zen/v1/responses | @ai-sdk/openai |
| Grok 4.5 | grok-4.5 | https://opencode.ai/zen/v1/responses | @ai-sdk/openai |
| Grok Build 0.1 | grok-build-0.1 | https://opencode.ai/zen/v1/responses | @ai-sdk/openai |
| Muse Spark 1.3 | muse-spark-1.3 | https://opencode.ai/zen/v1/responses | @ai-sdk/openai |
| Muse Spark 1.2 | muse-spark-1.2 | https://opencode.ai/zen/v1/responses | @ai-sdk/openai |
| Qwen3.7 Max | qwen3.7-max | https://opencode.ai/zen/v1/messages | @ai-sdk/anthropic |
| Qwen3.7 Plus | qwen3.7-plus | https://opencode.ai/zen/v1/messages | @ai-sdk/anthropic |
| Qwen3.6 Plus | qwen3.6-plus | https://opencode.ai/zen/v1/messages | @ai-sdk/anthropic |
| Qwen3.5 Plus | qwen3.5-plus | https://opencode.ai/zen/v1/messages | @ai-sdk/anthropic |
| DeepSeek V4 Pro | deepseek-v4-pro | https://opencode.ai/zen/v1/chat/completions | @ai-sdk/openai-compatible |
| DeepSeek V4 Flash | deepseek-v4-flash | https://opencode.ai/zen/v1/chat/completions | @ai-sdk/openai-compatible |
| DeepSeek V4 Flash Vision Exp | deepseek-v4-flash-vision-exp | https://opencode.ai/zen/v1/chat/completions | @ai-sdk/openai-compatible |
| MiniMax M3 | minimax-m3 | https://opencode.ai/zen/v1/chat/completions | @ai-sdk/openai-compatible |
| MiniMax M2.7 | minimax-m2.7 | https://opencode.ai/zen/v1/chat/completions | @ai-sdk/openai-compatible |
| MiniMax M2.5 | minimax-m2.5 | https://opencode.ai/zen/v1/chat/completions | @ai-sdk/openai-compatible |
| GLM 5.3 Flash | glm-5.3-flash | https://opencode.ai/zen/v1/chat/completions | @ai-sdk/openai-compatible |
| GLM 5.3 | glm-5.3 | https://opencode.ai/zen/v1/chat/completions | @ai-sdk/openai-compatible |
| GLM 5.2 | glm-5.2 | https://opencode.ai/zen/v1/chat/completions | @ai-sdk/openai-compatible |
| GLM 5.1 | glm-5.1 | https://opencode.ai/zen/v1/chat/completions | @ai-sdk/openai-compatible |
| GLM 5 | glm-5 | https://opencode.ai/zen/v1/chat/completions | @ai-sdk/openai-compatible |
| Kimi K2.5 | kimi-k2.5 | https://opencode.ai/zen/v1/chat/completions | @ai-sdk/openai-compatible |
| Kimi K2.6 | kimi-k2.6 | https://opencode.ai/zen/v1/chat/completions | @ai-sdk/openai-compatible |
| Kimi K2.7 Code | kimi-k2.7-code | https://opencode.ai/zen/v1/chat/completions | @ai-sdk/openai-compatible |
| Kimi K3 | kimi-k3 | https://opencode.ai/zen/v1/chat/completions | @ai-sdk/openai-compatible |
| Big Pickle | big-pickle | https://opencode.ai/zen/v1/chat/completions | @ai-sdk/openai-compatible |
| Union Alpha Free | union-alpha | https://opencode.ai/zen/v1/messages | @ai-sdk/anthropic |
| MiMo-V2.5 Free | mimo-v2.5-free | https://opencode.ai/zen/v1/chat/completions | @ai-sdk/openai-compatible |
| Ling 3.0 Flash Fin Free | ling-3.0-flash-fin-free | https://opencode.ai/zen/v1/chat/completions | @ai-sdk/openai-compatible |
| Nemotron 3 Ultra Free | nemotron-3-ultra-free | https://opencode.ai/zen/v1/chat/completions | @ai-sdk/openai-compatible |
| Nemotron 3.5 Lightning Free | nemotron-3.5-lightning-free | https://opencode.ai/zen/v1/chat/completions | @ai-sdk/openai-compatible |
| Muse Spark 1.3 Contributor Free | muse-spark-1.3-contributor-free | https://opencode.ai/zen/v1/responses | @ai-sdk/openai |
Inference with vercel AI API GATEWAY
These are the free models vercel AI API gateway has:
| Model | Context | Latency | Throughput | Input | Output | Cache |
|---|---|---|---|---|---|---|
| nvidia/nemotron-3.5-lightning | 1M | 0.1s | 48tps | Free | Free | Read: $0.01/M Free Write: — |
| nvidia/nemotron-3.5-lightning-free | 1M | 0.1s | 48tps | Free | Free | |
| fish-audio/s2.1-pro | Free | Free | ||||
| fish-audio/s2.1-pro-free | Free | Free | ||||
| poolside/laguna-s-2.1-free | 256K | 1.4s | 68tps | Free | Free | |
| fish-audio/s2-pro | Free | Free | ||||
| fish-audio/s2-pro-free | Free | Free | ||||
| fish-audio/transcribe-1 | Free | Free | ||||
| fish-audio/transcribe-1-free | Free | Free | ||||
| fish-audio/s1 | Free | Free | ||||
| fish-audio/s1-free | Free | Free |
Inference with Kilo Code
Kilocode free models
Kilocode allows you to use other inference endpoint providers but you can also use these free models that come with kilocode:
Inference with NVidia APIs
- endpoint URL :
https://integrate.api.nvidia.com/v1 - model list: Models | Try NVIDIA NIM APIs
from openai import OpenAI
import os
import sys
_USE_COLOR = sys.stdout.isatty() and os.getenv("NO_COLOR") is None
_REASONING_COLOR = "\033[90m" if _USE_COLOR else ""
_RESET_COLOR = "\033[0m" if _USE_COLOR else ""
client = OpenAI(
base_url = "https://integrate.api.nvidia.com/v1",
api_key = "YOUR_NVIDIA_API_KEY"
)
completion = client.chat.completions.create(
model="z-ai/glm-5.2",
messages=[{"role":"user","content":""}],
temperature=1,
top_p=1,
max_tokens=16384,
seed=42,
stream=True
)
for chunk in completion:
if not getattr(chunk, "choices", None):
continue
if len(chunk.choices) == 0 or getattr(chunk.choices[0], "delta", None) is None:
continue
delta = chunk.choices[0].delta
if getattr(delta, "content", None) is not None:
print(delta.content, end="")
nvidia free models
The endpoint URL is https://integrate.api.nvidia.com/v1, with the OpenAI-compatible inference endpoint being https://integrate.api.nvidia.com/v1/chat/completions
| name | modelTag | param count |
|---|---|---|
| nemotron-3-super-120b-a12b | nvidia/nemotron-3-super-120b-a12b | 120B |
| nemotron-3-ultra-550b-a55b | nvidia/nemotron-3-ultra-550b-a55b | 550B |
| gpt-oss-120b | openai/gpt-oss-120b | 120B |
| llama-3.3-70b-instruct | meta/llama-3_3-70b-instruct | 70B |
| qwen3-next-80b-a3b-instruct | qwen/qwen3-next-80b-a3b-instruct | 80B |
| gpt-oss-20b | openai/gpt-oss-20b | 20B |
| llama-3.1-8b-instruct | meta/llama-3_1-8b-instruct | 8B |
| deepseek-v4-flash | deepseek-ai/deepseek-v4-flash | N/A |
| qwen3.5-397b-a17b | qwen/qwen3.5-397b-a17b | 397B |
| llama-4-maverick-17b-128e-instruct | meta/llama-4-maverick-17b-128e-instruct | 400B (17B x 128E MoE) |
| kimi-k2.6 | moonshotai/kimi-k2.6 | N/A |
| minimax-m2.7 | minimaxai/minimax-m2.7 | N/A |
| qwen3.5-122b-a10b | qwen/qwen3.5-122b-a10b | 122B |
| llama-3.1-nemotron-nano-vl-8b-v1 | nvidia/llama-3.1-nemotron-nano-vl-8b-v1 | 8B |
| nemotron-3-nano-30b-a3b | nvidia/nemotron-3-nano-30b-a3b | 30B |
| mistral-small-4-119b-2603 | mistralai/mistral-small-4-119b-2603 | 119B |
| minimax-m3 | minimaxai/minimax-m3 | N/A |
| step-3.5-flash | stepfun-ai/step-3.5-flash | N/A |
| nemotron-3-nano-omni-30b-a3b-reasoning | nvidia/nemotron-3-nano-omni-30b-a3b-reasoning | 30B |
| glm-5.2 | z-ai/glm-5.2 | N/A |
| step-3.7-flash | stepfun-ai/step-3.7-flash | N/A |
| deepseek-v4-pro | deepseek-ai/deepseek-v4-pro | N/A |
| llama-3.3-nemotron-super-49b-v1.5 | nvidia/llama-3_3-nemotron-super-49b-v1_5 | 49B |
| llama-3.3-nemotron-super-49b-v1 | nvidia/llama-3_3-nemotron-super-49b-v1 | 49B |
| gemma-4-31b-it | google/gemma-4-31b-it | 31B |
| llama-3.1-70b-instruct | meta/llama-3_1-70b-instruct | 70B |
| nemotron-nano-12b-v2-vl | nvidia/nemotron-nano-12b-v2-vl | 12B |
| gemma-2-2b-it | google/gemma-2-2b-it | 2B |
| mistral-medium-3.5-128b | mistralai/mistral-medium-3.5-128b | 128B |
| nv-embed-v1 | nvidia/nv-embed-v1 | N/A |
| ministral-14b-instruct-2512 | mistralai/ministral-14b-instruct-2512 | 14B |
| llama-3.2-90b-vision-instruct | meta/llama-3.2-90b-vision-instruct | 90B |
| diffusiongemma-26b-a4b-it | google/diffusiongemma-26b-a4b-it | 26B |
| llama-3.2-11b-vision-instruct | meta/llama-3.2-11b-vision-instruct | 11B |
| nemotron-mini-4b-instruct | nvidia/nemotron-mini-4b-instruct | 4B |
| gemma-3n-e4b-it | google/gemma-3n-e4b-it | 4B |
| nvidia-nemotron-nano-9b-v2 | nvidia/nvidia-nemotron-nano-9b-v2 | 9B |
| nemotron-3.5-content-safety | nvidia/nemotron-3.5-content-safety | N/A |
| nv-embedcode-7b-v1 | nvidia/nv-embedcode-7b-v1 | 7B |
| gemma-3n-e2b-it | google/gemma-3n-e2b-it | 2B |
| llama-3.2-3b-instruct | meta/llama-3.2-3b-instruct | 3B |
| rerank-qa-mistral-4b | nvidia/rerank-qa-mistral-4b | 4B |
| mistral-nemotron | mistralai/mistral-nemotron | 12B |
| llama-3.1-nemotron-nano-8b-v1 | nvidia/llama-3_1-nemotron-nano-8b-v1 | 8B |
| dracarys-llama-3.1-70b-instruct | abacusai/dracarys-llama-3_1-70b-instruct | 70B |
| mixtral-8x7b-instruct-v0.1 | mistralai/mixtral-8x7b-instruct | 47B (8x7B MoE) |
| seed-oss-36b-instruct | bytedance/seed-oss-36b-instruct | 36B |
| esmfold | meta/esmfold | 3B |
| llama-3.2-1b-instruct | meta/llama-3.2-1b-instruct | 1B |
| solar-10.7b-instruct | upstage/solar-10_7b-instruct | 10.7B |
| gliner-pii | nvidia/gliner-pii | N/A |
| ising-calibration-1-35b-a3b | nvidia/ising-calibration-1-35b-a3b | 35B |
| sarvam-m | sarvamai/sarvam-m | N/A |
| llama-guard-4-12b | meta/llama-guard-4-12b | 12B |
| llama-3.1-nemotron-safety-guard-8b-v3 | nvidia/llama-3_1-nemotron-safety-guard-8b-v3 | 8B |
| riva-translate-4b-instruct-v1_1 | nvidia/riva-translate-4b-instruct-v1_1 | 4B |
| synthetic-video-detector | nvidia/synthetic-video-detector | N/A |
| magpie-tts-zeroshot | nvidia/magpie-tts-zeroshot | N/A |
| paligemma | google/google-paligemma | 3B |
| Studio Voice | nvidia/studiovoice | N/A |
| esm2-650m | meta/esm2-650m | 650M |
| cosmos3-nano-reasoner | nvidia/cosmos3-nano-reasoner | N/A |
| cosmos3-nano | nvidia/cosmos3-nano | N/A |
| Active Speaker Detection | nvidia/active-speaker-detection | N/A |
| Background Noise Removal | nvidia/bnr | N/A |
| nemotron-voicechat | nvidia/nemotron-voicechat | N/A |
| cosmos-transfer1-7b | nvidia/cosmos-transfer1-7b | 7B |
| streampetr | nvidia/streampetr | N/A |
| bevformer | nvidia/bevformer | N/A |
| sparsedrive | nvidia/sparsedrive | N/A |
| cosmos-transfer2.5-2b | nvidia/cosmos-transfer2_5-2b | 2B |
| inkling | thinkingmachines/inkling | N/A |
| ising-calibration-1.5-31b | nvidia/ising-calibration-1.5-31b | 31B |
| laguna-xs-2.1 | poolside/laguna-xs-2.1 | N/A |
| nemotron-3-embed-1b | nvidia/nemotron-3-embed-1b | 1B |
| nemotron-3.5-nano-30b-a3b | nvidia/nemotron-3.5-nano-30b-a3b | 30B |
| seallm-7b-v2.5 | seallms/seallm-7b | 7B |
MCP
Deploying to MCP clients
All MCP clients have the same way of deploying, which is listing the commands to run the MCP servers or the existing urls hosting MCP servers in a JSON file like so:
{
"mcpServers": {
"local-mcp-server": {
"command": "deno",
"args": [
"run",
"-A",
"C:/Users/Waadl/OneDrive/Documents/dbdildev/mcp/local-mcp-server/main.ts"
],
"env": {
"GOOGLE_GENERATIVE_AI_API_KEY": "Eafsadfdsafasfdsafsd",
"OPENAI_API_KEY": "sk-pasfsafsadfaHfsadsfdEgsRIsaffdsDNVsafdfsdad"
}
},
"memory": {
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-memory"]
},
"github": {
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-github"],
"env": {
"GITHUB_PERSONAL_ACCESS_TOKEN": "ghp_FfadffdsasadRW9p"
}
}
}
}
Claude desktop
you can add MCP servers in the ~\AppData\Roaming\Claude\claude_desktop_config.json path
Cursor
Go to cursor MCP settings and you can add MCP servers in the ~\.cursor\mcp.json file, or you can just go to cursor settings -> MCP settings.
You can also set local MCP settings for your workspace, which is often way more efficient by creating a .cursor/mcp.json file:
{
"mcpServers": {
"mcpmcp": {
"command": "npx",
"args": ["-y", "mcp-remote@latest", "https://mcpmcp.io/mcp"]
}
}
}
MCP use cases
Awesome MCP: list of MCP servers
- https://mcpmcp.io/#install: mcp server to ask your agent about what MCP servers there are
- https://github.com/regenrek/deepwiki-mcp: to find info about a specific repo
Vibing with MCP
Here is the ultimate way to vibe code using MCP servers:
- github skill: create issues, PRs, assign AI bots to your pull requests
- neon MCP: connect to a database so the schemas are known at all times.
- playwright MCP: Tell it to "make liberal use of Playwright to make sure that UI looks and acts correctly and set up integration tests."
- context7: context7 for docs, tell the model to use context7 for some libraries that might be esoteric.
Tech stack:
- neon auth
- neon db: Use neon with drizzle, and specifically prompt it, "DO NOT MODIFY THE MIGRATIONS DIRECTLY, ONLY USE DRIZZLE"
- nextjs + typescript + shadcdn + tailwindcss: specify nextjs 15 modern strategies like limiting client components
- zod, react query, zustand
Here is the full vibing prompt
---REPLACE PROMPT BELOW-----
I am making a Todoist clone. I want it to have the following features
- Multiple users
- Users can CRUD their todos
- Users can mark their todos as done
- Users cannot share todos - you can assume that a todo belongs to one person
- Users can use tags to tag their todos. Examples would be work, personal, or fun. Users can CRUD tags. A todo can have multiple tags.
- Users can sign, sign out, and log out.
------------------------------
For the tech stack, please use
- Next.js 16 and TypeScript
- shadcn - please use shadcn as the styling method as much as possible to be consistent
- Neon Postgres for the database, connected via neon MCP
- Neon Auth for the auth - please use Context7 to make sure you have up to date docs on Neon Auth
- Drizzle for the ORM
- TypeScript
- ESLint
- Vitest for testing
- Playwright for integration tests
Please:
- include decent coverage of tests
- use Playwright MCP server to test that UI is styled correctly and interactions work as planned
- use Context7 liberally to make sure you have the latest docs for various libraries.
- prepare this to be deployed to Vercel afterwards.
- DO NOT WRITE OR MODIFY MIGRATIONS YOURSELF. ONLY USE DRIZZLE FOR MIGRATIONS.
Condensing docs
One of the most important uses of MCP is giving online, up-to-date docs for an AI agent to consume. There are two ways you can do this:
- Context7: An MCP server that has tools to fetch online documentation and return it as markdown.
- RepoMix: Go to the Repomix website to download the entire docs as a markdown file you cna then feed into LLMs.
Context7 MCP
Looks like this:
{
"mcpServers": {
"context7": {
"command": "npx",
"args": ["-y", "@upstash/context7-mcp@latest"]
}
}
}
Chrome devtools MCP
The Chrome DevTools MCP lets AI agents like Claude interact directly with your running browser. It gives the AI "eyes" to take screenshots, read console messages, inspect network requests, and record performance traces.
{
"mcpServers": {
"chrome-devtools": {
"command": "npx",
"args": ["chrome-devtools-mcp@latest"]
}
}
}
Make sure to start a chrome instance with remote debugging available for this to work:
google-chrome --remote-debugging-port=9222
Playwright MCP
Installation
Claude
Skills
Custom skill examples
Frontend design skill
# Frontend Design Skill
ALSO USE TAILWIND, change tailwind config and variables according to design principles in this skill, use it for everything, only escape to CSS for extremely custom things
## Purpose
This skill helps Claude create distinctive, memorable frontends that avoid generic AI-generated design patterns. It emphasizes typography, color cohesion, motion, and intentional interactions that elevate user experience.
## Principles
### 1. Distinctive Typography
- Use Google Fonts strategically for personality (serif + sans-serif combinations)
- Implement proper typographic hierarchy with `clamp()` for responsive scaling
- Employ letter-spacing and font-weight strategically for emphasis
- Examples: Playfair Display for headlines, custom sans-serif for body
- Avoid: Default system fonts, inconsistent font sizes, poor line-height
### 2. Cohesive Color Systems
- Define CSS variables for semantic color naming (primary, accent, background, text)
- Use gradients sparingly but effectively for visual interest
- Maintain contrast ratios (WCAG AA minimum 4.5:1 for text)
- Create a 5-8 color palette with defined relationships
- Use opacity and alpha channels for depth (rgba)
- Avoid: Random hex colors, unnamed colors scattered across CSS
### 3. Orchestrated Motion & Animation
- Apply staggered animations (offset delays) to sequenced elements
- Use easing functions like `cubic-bezier(0.34, 1.56, 0.64, 1)` for personality
- Animate transforms (scale, rotate, translateY) not properties that trigger layout
- Provide visual feedback on interactive elements (hover, focus)
- Use `backdrop-filter: blur()` for glassmorphism effects
- Avoid: Motion that doesn't serve purpose, jarring animations, excessive transitions
### 4. High-Impact Micro-Interactions
- Hover states that provide feedback (scale, color shift, border change)
- Animated underlines on navigation links
- Icon animations on hover (rotate, scale)
- Smooth transitions on state changes
- Loading states and visual confirmations
- Avoid: Static, unresponsive interfaces
### 5. Layout & Spacing
- Use CSS custom properties for consistent spacing (--spacing-xs through --spacing-2xl)
- Implement max-width containers for readability
- Use CSS Grid and Flexbox with proper gap management
- Responsive design with mobile-first approach
- Whitespace as a design element
- Avoid: Fixed pixels, inconsistent spacing, layouts that don't adapt
### 6. Anti-Patterns to Avoid (AI Slop)
- Flat, colorless purple/blue gradients without intention
- System font (Inter) with no personality
- Pure white backgrounds with gray text
- Generic emoji icons
- No visual hierarchy or emphasis
- Static content with zero interactivity
- Generic marketing copy ("Streamline Your Workflow")
## Implementation Checklist
- [ ] Define CSS variables for colors, spacing, typography
- [ ] Implement 2+ custom Google Fonts with clear hierarchy
- [ ] Create gradient effects that serve purpose
- [ ] Add entrance animations with staggered delays
- [ ] Include hover/focus states on interactive elements
- [ ] Use backdrop-filter or creative backgrounds
- [ ] Implement semantic color naming
- [ ] Ensure mobile responsiveness with @media queries
- [ ] Test contrast ratios with accessibility tools
- [ ] Avoid naming elements generically ("container", "wrapper")
## Example Patterns
### CSS Variables Pattern
```css
:root {
--color-primary: #2563eb;
--color-accent: #f97316;
--color-text: #0f172a;
--spacing-md: 1.5rem;
}
```
### Staggered Animation Pattern
```css
.element {
animation: fadeInUp 0.8s ease-out 0.2s both;
}
.element:nth-child(2) {
animation-delay: 0.3s;
}
```
### Hover Interaction Pattern
```css
.button:hover {
transform: translateY(-3px);
box-shadow: 0 15px 35px rgba(0, 0, 0, 0.2);
}
```
### Typography Scale Pattern
```css
h1 {
font-size: clamp(2rem, 6vw, 4rem);
line-height: 1.2;
letter-spacing: -0.02em;
}
```
## When to Apply
- Building new UI components or pages
- Redesigning existing interfaces that feel generic
- Creating marketing landing pages
- Elevating visual hierarchy in dashboards
- Adding polish and personality to applications
## Success Metrics
- Does the design feel intentional, not AI-generated?
- Does typography provide clear hierarchy?
- Are colors used systematically (via variables)?
- Do animations enhance, not distract?
- Is the interface responsive and accessible?
- Does motion serve a functional purpose?
## References
- https://fonts.google.com/
- https://www.cssgradientsanmartino.com/
- https://easings.net/
- https://web.dev/responsive-web-design-basics/
AI resources
Voice
image
This lets you create shirts:
lexica, stable diffusion search engine: