Skip to content

Commit 8092067

Browse files
authored
Initial commit
0 parents  commit 8092067

17 files changed

Lines changed: 1070 additions & 0 deletions

File tree

Lines changed: 93 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,93 @@
1+
---
2+
name: design-prototyping
3+
description: This skill describes how to create prototype pages to explore website designs and copy
4+
---
5+
6+
# Design Brief
7+
8+
You are creating design prototypes for a marketing/landing page site.
9+
10+
## Step 1: Understand the Product
11+
12+
If this is a new repo:
13+
14+
- Read `docs/concept.md` in this repository. It describes the product or concept this site will market. Internalize the key value propositions, features, and positioning before proceeding.
15+
16+
If this is an existing website:
17+
18+
- Read the `src/index.astro` in this repository. The copy should be used as a source for the concept of the site.
19+
20+
## Step 2: Clarify the Purpose
21+
22+
Confirm with the user the following before proceeding:
23+
24+
1. **Who is the intended audience?** (e.g., developers, small business owners, general consumers, enterprise buyers)
25+
2. **What is the primary call-to-action?** The most common case is email collection for gauging interest (lean startup MVP style), but confirm this with the user. Other options could include: Calendly style scheduler (Use ShadCN), Join our Discord, follow us on Bluesky/X
26+
3. **Are there any brand constraints?** (e.g., specific colors, existing logo, tone of voice) If none, you have full creative freedom.
27+
4. **What company owns the site?** Ask if the site should state one. By default the company that owns the site is Wyrd, at https://wyrd.company. Other options includes Dark Futures Interactive (https://darkfutures.com) and Scratching Monkey Software (https://scratchingmonkey.com). The user may ask to omit it.
28+
5. **Whould the site have a login page, about page, privacy policy page, and/or terms of use page?**
29+
30+
## Step 3: Set Up the Project (skip if already setup)
31+
32+
1. Run `pnpm create astro@latest` in the project root. Choose the empty template, strict TypeScript, and accept defaults. Answer yes to installing dependencies. You will have to copy the contents of the subfolder created to the root. Do not overwrite README.md.
33+
2. Update the astro config to bind the site to the host 0.0.0.0 since you are running in a devcontainer.
34+
3. Install and configure Tailwind CSS for Astro.
35+
36+
## Step 4: Create Design Prototypes
37+
38+
Create the number of distinct prototypes specified by the user in their prompt (e.g., "create 3 prototypes").
39+
40+
### Routing
41+
42+
- Each prototype is a single page accessible at `/1`, `/2`, `/3`, etc.
43+
- Create these as `src/pages/1/index.astro`, `src/pages/2/index.astro`, etc.
44+
45+
### Design Requirements
46+
47+
- **Each prototype must be a completely different design.** Vary layout structure, color palette, typography, visual style, and overall feel. One might be bold and dark, another minimal and airy, another playful and colorful. Exercise full creative freedom.
48+
- Each prototype is a complete, single-page marketing/landing page.
49+
- Write original copy for each prototype grounded in `concept.md` and tailored to the intended audience established in Step 2. Don't reuse the same copy across prototypes.
50+
- Each prototype must include the agreed-upon call-to-action (e.g., an email signup form).
51+
- Use Tailwind CSS for all styling. No external CSS frameworks.
52+
- If the page has interactive elements, use React/ShadCN when needed.
53+
- Pages should be responsive and look good on both mobile and desktop.
54+
55+
### Prototype Navigation
56+
57+
Include a navigation element on every prototype page that allows switching between prototypes (links to `/1`, `/2`, `/3`, etc.). Implement a common layout that adds the navigation to each prototype.
58+
59+
**Important:** This navigation is a utility element for reviewing the prototypes. It is **not** part of the prototype's design. It should be clearly separate and unobtrusive -- you decide the form (a floating bar, a small corner pill, a minimal strip, etc.) as long as it does not interfere with or appear to be part of the prototype design itself.
60+
61+
## Step 5: Verify
62+
63+
1. Run `pnpm dev` and confirm each prototype page loads without errors.
64+
2. Verify that navigation between prototypes works.
65+
3. Check that pages render correctly at different viewport widths.
66+
67+
## Step 6: Review
68+
69+
Review the prototypes created, even previous ones. Provide your opinion on which are your favorites and why. Also consider the copy of each one, what is the strongest copy and why?
70+
71+
## Step 7: Iterate and select
72+
73+
The user will likely want to iterate on the designs. This may involve creating new prototypes. Some entirely new, others variations of existing ones.
74+
75+
The user will eventually identify the one prototype that is the winner.
76+
77+
## Step 8: Finalize
78+
79+
Once the winner is selected:
80+
81+
1. Update the root page to the design of the winning prototype.
82+
2. Remove the existing prototypes.
83+
3. (If new or updated) Use the favicon skill to create a favicon for the site. Use `rsvg-convert` to convert the svg to png so it is not blurry.
84+
4. (If new) Have the user set the GitHub repository secret: DREAMHOST_REMOTE `ssh://scratchingmonkey@<site name>/home/scratchingmonkey/<site name>.git`
85+
5. If there is an email form, set it up to use the `sf_3ha45db65ai25lcglfme20fj` key and show a confirmation page, `signup-confirmed` or `waitlist-confirmed`, that has a button to go back to the home page.
86+
6. Update the README.md
87+
7. **Where will the site be hosted?** Ask if the site will be hosted on Dreamhost or Cloudflare. The `.github/workflows/cd.yml` has commented out steps for each. Uncomment the appropriate one and remove the unneeded commented step.
88+
89+
```html
90+
<form action="https://api.staticforms.dev/submit" method="POST">
91+
<!-- Your API Key (replace with your actual key) -->
92+
<input type="hidden" name="apiKey" value="YOUR_API_KEY">
93+
```

.devcontainer/devcontainer.json

Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,94 @@
1+
{
2+
"name": "<site name> Devcontainer",
3+
"image": "mcr.microsoft.com/devcontainers/base:noble",
4+
"features": {
5+
"ghcr.io/devcontainers/features/node:1": {},
6+
"ghcr.io/devcontainers-extra/features/apt-get-packages:1": {
7+
"packages": "imagemagick,librsvg2-bin"
8+
}
9+
},
10+
"mounts": [
11+
{
12+
"source": "claude",
13+
"target": "/home/vscode/.claude",
14+
"type": "volume"
15+
},
16+
{
17+
"source": "codex",
18+
"target": "/home/vscode/.codex",
19+
"type": "volume"
20+
},
21+
{
22+
"source": "gemini",
23+
"target": "/home/vscode/.gemini",
24+
"type": "volume"
25+
},
26+
{
27+
"source": "gemini",
28+
"target": "/home/vscode/.gemini",
29+
"type": "volume"
30+
},
31+
{
32+
"source": "gemini-auth",
33+
"target": "/home/vscode/.cache/google-vscode-extension",
34+
"type": "volume"
35+
},
36+
{
37+
"source": "agents",
38+
"target": "/home/vscode/.agents",
39+
"type": "volume"
40+
},
41+
],
42+
"customizations": {
43+
"vscode": {
44+
"extensions": [
45+
// Data and formats
46+
"redhat.vscode-yaml",
47+
48+
// Markdown and documentation
49+
"yzhang.markdown-all-in-one",
50+
"bierner.markdown-mermaid",
51+
52+
//Stack
53+
"ms-vscode.vscode-typescript-next",
54+
"bradlc.vscode-tailwindcss",
55+
"astro-build.astro-vscode",
56+
57+
// General productivity
58+
"Gruntfuggly.todo-tree",
59+
"eamodio.gitlens",
60+
"github.vscode-github-actions",
61+
"GitHub.vscode-pull-request-github",
62+
63+
// AI assistants
64+
"anthropic.claude-code",
65+
"google.geminicodeassist",
66+
"google.gemini-cli-vscode-ide-companion",
67+
"openai.chatgpt",
68+
"kilocode.Kilo-Code"
69+
],
70+
"settings": {
71+
}
72+
}
73+
},
74+
75+
"remoteEnv": {
76+
},
77+
78+
"forwardPorts": [4321],
79+
"portsAttributes": {
80+
"4321": {
81+
"label": "Astro App",
82+
"onAutoForward": "openBrowser"
83+
}
84+
},
85+
86+
"postCreateCommand": {
87+
"own-cache": "mkdir -p /home/vscode/.cache && sudo chown -R vscode:vscode /home/vscode/.cache",
88+
"task": "npm install -g @go-task/cli",
89+
"claude-code": "curl -fsSL https://claude.ai/install.sh | bash",
90+
"gemini": "npm install -g @google/gemini-cli",
91+
"codex": "npm i -g @openai/codex",
92+
"skills": "npx -y skills list"
93+
}
94+
}

.devcontainer/launch.json

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
{
2+
"version": "0.2.0",
3+
"configurations": [
4+
{
5+
"command": "taskfile dev",
6+
"name": "Development server",
7+
"request": "launch",
8+
"type": "node-terminal"
9+
}
10+
]
11+
}

.github/workflows/cd.yml

Lines changed: 93 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,93 @@
1+
name: CD
2+
3+
on:
4+
workflow_dispatch:
5+
push:
6+
branches:
7+
- main
8+
paths:
9+
- 'src/**'
10+
- 'public/**'
11+
- 'astro.config.mjs'
12+
- 'tailwind.config.mjs'
13+
- 'tsconfig.json'
14+
- 'package.json'
15+
- 'pnpm-lock.yaml'
16+
17+
jobs:
18+
deploy:
19+
runs-on: ubuntu-latest
20+
21+
steps:
22+
- name: Checkout
23+
uses: actions/checkout@v4
24+
25+
- name: Setup pnpm
26+
uses: pnpm/action-setup@v4
27+
with:
28+
version: 10
29+
run_install: false
30+
31+
- name: Setup Node
32+
uses: actions/setup-node@v4
33+
with:
34+
node-version: 22
35+
cache: pnpm
36+
37+
- name: Install dependencies
38+
run: pnpm install
39+
40+
- name: Build production dist
41+
run: pnpm build
42+
43+
# - name: Setup SSH key
44+
# uses: webfactory/ssh-agent@v0.9.0
45+
# with:
46+
# ssh-private-key: ${{ secrets.DREAMHOST_SSH_KEY }}
47+
48+
# - name: Add DreamHost host key
49+
# env:
50+
# DREAMHOST_REMOTE: ${{ secrets.DREAMHOST_REMOTE }}
51+
# run: |
52+
# set -euo pipefail
53+
54+
# HOST=""
55+
# if [[ "$DREAMHOST_REMOTE" =~ ^ssh://[^@]+@([^/:]+) ]]; then
56+
# HOST="${BASH_REMATCH[1]}"
57+
# elif [[ "$DREAMHOST_REMOTE" =~ ^[^@]+@([^:]+): ]]; then
58+
# HOST="${BASH_REMATCH[1]}"
59+
# fi
60+
61+
# if [[ -z "$HOST" ]]; then
62+
# echo "Unable to parse host from DREAMHOST_REMOTE"
63+
# exit 1
64+
# fi
65+
66+
# mkdir -p ~/.ssh
67+
# ssh-keyscan -H "$HOST" >> ~/.ssh/known_hosts
68+
69+
# - name: Push dist to DreamHost Git remote
70+
# env:
71+
# DREAMHOST_REMOTE: ${{ secrets.DREAMHOST_REMOTE }}
72+
# run: |
73+
# set -euo pipefail
74+
75+
# cd dist
76+
# touch .nojekyll
77+
78+
# git init
79+
# git config user.name "github-actions[bot]"
80+
# git config user.email "41898282+github-actions[bot]@users.noreply.github.com"
81+
# git add -A
82+
# git commit -m "Deploy ${GITHUB_SHA}"
83+
# git branch -M main
84+
# git remote add dreamhost "$DREAMHOST_REMOTE"
85+
# git push --force dreamhost main
86+
87+
# - uses: actions/checkout@v4
88+
# - name: Deploy
89+
# uses: cloudflare/wrangler-action@v3
90+
# with:
91+
# apiToken: ${{ secrets.CLOUDFLARE_PAGES_API_TOKEN }}
92+
# accountId: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }}
93+
# command: pages deploy ./dist --project-name=${{ secrets.CLOUDFLARE_PROJECT_ID }}

.gitignore

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
# build output
2+
dist/
3+
4+
# generated types
5+
.astro/
6+
7+
# dependencies
8+
node_modules/
9+
.pnpm-store/
10+
11+
# logs
12+
npm-debug.log*
13+
yarn-debug.log*
14+
yarn-error.log*
15+
pnpm-debug.log*
16+
17+
# environment variables
18+
.env
19+
.env.production
20+
21+
# macOS-specific files
22+
.DS_Store
23+
24+
# jetbrains setting folder
25+
.idea/

AGENTS.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
This is a Astro website repo.
2+
3+
Skills can be found in `.agents/skills`
4+
5+
Discover additional skills by running `npx skills list -g`. Use relevant skills (front-end design, astro, tailwind, favicon, etc.).

README.md

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
# <site name>
2+
3+
## Design
4+
5+
1. Open in devcontainer
6+
2. If this is a new website, prompt your AI agent to run the init.sh. Rebuid the devcontainer.
7+
3. Fill in `docs/concept.md` with a description of your product or concept
8+
4. Prompt your AI agent: "Use the design-prototyping skill and create N prototypes"
9+
5. Work with the agent to create and refine prototypes until the design is finalized.

Taskfile.yml

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
version: '3'
2+
3+
tasks:
4+
dev:
5+
desc: Start Astro development server
6+
cmds:
7+
- astro dev
8+
9+
install:
10+
desc: Install dependencies
11+
cmds:
12+
- pnpm install

astro.config.mjs

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
// @ts-check
2+
import { defineConfig } from 'astro/config';
3+
4+
import tailwindcss from '@tailwindcss/vite';
5+
6+
// https://astro.build/config
7+
export default defineConfig({
8+
server: {
9+
host: '0.0.0.0',
10+
},
11+
vite: {
12+
plugins: [tailwindcss()]
13+
}
14+
});

concept.md

Whitespace-only changes.

0 commit comments

Comments
 (0)