

Also from Kynth Studios


Also from Kynth Studios


Also from Kynth Studios
1# PHPStan Website (phpstan.org)23Static website for PHPStan - PHP Static Analysis Tool.45## Tech Stack67- **Static site generator:** Eleventy (11ty) v28- **Bundler:** Vite9- **Styling:** TailwindCSS v3 with PostCSS and autoprefixer10- **Templating:** Nunjucks (11ty layouts/includes), Markdown (content pages, blog posts)11- **Client-side JS:** TKO (Technical Knockout 4, the Knockout.js successor), TypeScript (ES6 target), jQuery12- **Code editor:** CodeMirror 6 (playground)13- **Syntax highlighting:** Prism.js (build-time via 11ty plugin)14- **Search:** Algolia DocSearch15- **Markdown:** markdown-it with plugins (anchors, footnotes, abbreviations, attrs)1617## Build Pipeline1819The build is a two-stage process:20211. **`npm run build:11ty`** — Eleventy compiles templates and content from `src/` into `tmp/`222. **`npm run build:vite`** — Vite bundles and optimizes everything from `tmp/` into `dist/`2324The final deployable output is the `dist/` directory.2526### Key Directories2728- `src/` — Source files (templates, content, styles, TypeScript)29- `tmp/` — Intermediate build output from Eleventy (gitignored)30- `dist/` — Final build output from Vite (gitignored)3132### Scripts3334- `npm run build` — Full production build (11ty + Vite)35- `npm run watch` — Dev mode (runs 11ty watch + Vite dev server in parallel)36- `npm run check` — TypeScript type-check + ESLint37- `npm run fix` — ESLint auto-fix38- `npm run test:visual` — Run Playwright visual regression tests39- `npm run test:visual:update` — Update visual test snapshots4041### Deployment4243Built on GitHub Actions, deployed to AWS S3 (`web-phpstan.org` bucket) with CloudFront CDN invalidation. Triggered by pushes to `2.1.x` branch affecting `website/**`.4445## Source Structure4647- `src/_layouts/` — Nunjucks page layouts48- `src/_includes/` — Nunjucks partial templates49- `src/_data/` — 11ty global data files50- `src/_posts/` — Blog posts (Markdown)51- `src/js/` — TypeScript source files52- `src/user-guide/` — User guide documentation (Markdown)53- `src/developing-extensions/` — Extension development docs54- `src/writing-php-code/` — PHP writing guide55- `src/app.pcss` — Main stylesheet (Tailwind + custom CSS)56- `visual-tests/` — Playwright visual regression tests and baseline screenshots5758## Eleventy Configuration5960Configured in `.eleventy.js`:61- Input: `src/`, Output: `tmp/`, Layouts dir: `_layouts`62- Plugins: syntax highlighting (with diff support), RSS, rendering63- Custom filters for dates (Luxon), reading time, path trimming64- Mermaid diagram rendering with file-based caching65- Social image generation via `capture-website`6667## Verifying Changes6869Run `npm run test:visual` to execute Playwright visual regression tests. These tests compare screenshots against baseline snapshots stored in `visual-tests/`. If changes are intentional, update snapshots with `npm run test:visual:update`.7071When making changes, build with `npm run build` and compare the `dist/` directory before and after. Some differences are expected (hashed filenames, minor whitespace) but:72- No whole sections of generated HTML should disappear73- The website should still look the same visually74- Check that pages render correctly, not just that the build succeeds7576### Playwright Screenshots for UI Development7778When working on visual UI changes (especially the playground), use Playwright to take screenshots and iterate on the design. The dev server runs at `http://localhost:5173` (started via `npm run watch`). Use Node.js scripts with `@playwright/test` (installed in the project) like this:7980```js81node -e "82const { chromium } = require('@playwright/test');83(async () => {84 const browser = await chromium.launch();85 const page = await browser.newPage({ viewport: { width: 1280, height: 900 } });86 await page.goto('http://localhost:5173/try');87 await page.waitForTimeout(2000);88 // Interact with the page (click buttons, open dialogs, etc.)89 await page.click('button:has-text(\"Options\")');90 await page.waitForTimeout(500);91 await page.screenshot({ path: '/tmp/screenshot.png' });92 await browser.close();93})();94"95```9697Also check the browser console for errors:9899```js100page.on('console', msg => { if (msg.type() === 'error') console.log(msg.text()); });101page.on('pageerror', err => console.log(err.message));102```103104Take screenshots at multiple viewport sizes (desktop 1280x900, mobile 375x812) to verify responsive layouts. Read the screenshot images to visually inspect the result, then adjust code and re-screenshot as needed.105
One repository carrying more than one format is the comparison this product exists for: does anyone actually write different content in each file, or is one a copy of the other?
| Repository | Format | Stack | Covers | Score | Changed |
|---|---|---|---|---|---|
| phpstan/phpstanCLAUDE.md · 14k | CLAUDE.md | buildarchgitdeployment | 82/100 | 14 days ago | |
| phpstan/phpstanwebsite/errors/CLAUDE.md · 14k | CLAUDE.md | lint-formatstyledo-notdocs | 77/100 | 14 days ago | |
| phpstan/phpstanwebsite/infra/CLAUDE.md · 14k | CLAUDE.md | teststylearchdeployment | 94/100 | 14 days ago | |
| phpstan/phpstanwebsite/src/_posts/CLAUDE.md · 14k | CLAUDE.md | lint-formatstylearchtypes+1 | 74/100 | 14 days ago |
Same format, overlapping stack, ranked by quality.
| Repository | Format | Stack | Covers | Score | Changed |
|---|---|---|---|---|---|
| livewire/livewireCLAUDE.md · 24k | CLAUDE.md | setupbuildteststyle+4 | 100/100 | 14 days ago | |
| bagisto/bagistoCLAUDE.md · 28k | CLAUDE.md | setupbuildteststyle+5 | 100/100 | 7 days ago | |
| microsoft/playwrightCLAUDE.md · 94k | CLAUDE.md | buildtestlint-formatstyle+7 | 100/100 | 7 days ago | |
| Adit-Jain-srm/NightmareNetCLAUDE.md · 45 | CLAUDE.md | buildtestlint-formatstyle+6 | 100/100 | 14 days ago | |
| dotCMS/corecore-web/CLAUDE.md · 949 | CLAUDE.md | teststylearchtesting-strategy+3 | 100/100 | 14 days ago | |
| tyrchen/geektime-bootcamp-aiw7/genslides/backend/CLAUDE.md · 230 | CLAUDE.md | testlint-formatstylearch+6 | 100/100 | 9 days ago | |
| nimbalyst/nimbalystpackages/android/CLAUDE.md · 1.4k | CLAUDE.md | setupbuildstylearch+2 | 100/100 | 14 days ago | |
| dotCMS/coreCLAUDE.md · 949 | CLAUDE.md | setupbuildteststyle+7 | 99/100 | 9 days ago |
A badge carrying the measured quality of the strongest agent config file in this repository, out of 100. It reads from this index every time somebody loads your page, so it changes when the measurement changes and there is nothing to keep up to date. Free, no account, and the value is not something you or we can set by hand.
[](https://rulestack.kynth.studio/configs/phpstan-phpstan-website-claude)Would rather not hotlink us? Every badge is also served in shields.io’s endpoint schema, so shields renders the image and your readers never talk to our domain:
Published by Toolproof, the masthead over this index and eight others. The method behind the number is at toolproof.kynth.studio/methodology, and the whole thing is readable as JSON with no key at /api.