The site now presents one freelance developer on one page: hero, introduction, four typical cases (developer for a product, make an app reliable, automate a process, a website) with what you get, how it runs and what it costs, a process automation section, technology and project fit, how I work, two live references, questions and contact. - Hero and closing headline are drawn from running binary digits. - Each case explains its four steps with an animated drawing; the automation section shows example workflows with work travelling between systems; a pipeline run shows what a test catches before a release. - Contact is one email address, kept in parts and assembled in the browser so it never appears in the page source (src/domain/email.ts, spec first). - Imprint and privacy pages added. - The old site (blog, case studies, contact form, fixed-price pages, video rendering and related scripts) is removed. Its URLs redirect to the homepage. - The deploy smoke test checks the legal pages and the redirects instead of the removed case study. - Dev scripts use docker compose v2. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
128 lines
4.2 KiB
JSON
128 lines
4.2 KiB
JSON
{
|
|
"name": "@mintel/web",
|
|
"type": "module",
|
|
"version": "0.1.0",
|
|
"description": "Technical problem solver's blog - practical insights and learning notes",
|
|
"scripts": {
|
|
"dev": "next dev --webpack --hostname 0.0.0.0",
|
|
"dev:native": "next dev --webpack",
|
|
"build": "next build --webpack",
|
|
"start": "next start",
|
|
"lint": "eslint app src scripts",
|
|
"test": "vitest run",
|
|
"test:coverage": "vitest run --coverage",
|
|
"pagespeed:test": "npx tsx ./scripts/pagespeed-sitemap.ts",
|
|
"typecheck": "tsc --noEmit",
|
|
"test:mutation": "stryker run",
|
|
"check:og": "tsx scripts/check-og-images.ts"
|
|
},
|
|
"dependencies": {
|
|
"@aws-sdk/client-s3": "^3.750.0",
|
|
"@emotion/is-prop-valid": "^1.4.0",
|
|
"@mdx-js/loader": "^3.1.1",
|
|
"@mdx-js/react": "^3.1.1",
|
|
"@mintel/concept-engine": "link:../../../at-mintel/packages/concept-engine",
|
|
"@mintel/content-engine": "link:../../../at-mintel/packages/content-engine",
|
|
"@mintel/estimation-engine": "link:../../../at-mintel/packages/estimation-engine",
|
|
"@mintel/meme-generator": "link:../../../at-mintel/packages/meme-generator",
|
|
"@mintel/pdf": "link:../../../at-mintel/packages/pdf-library",
|
|
"@mintel/thumbnail-generator": "link:../../../at-mintel/packages/thumbnail-generator",
|
|
"@next/mdx": "^16.1.6",
|
|
"@next/third-parties": "^16.1.6",
|
|
"@opentelemetry/api": "^1.9.0",
|
|
"@opentelemetry/context-async-hooks": "^2.1.0",
|
|
"@opentelemetry/core": "^2.1.0",
|
|
"@opentelemetry/sdk-trace-base": "^2.1.0",
|
|
"@react-pdf/renderer": "^4.3.2",
|
|
"@remotion/bundler": "^4.0.414",
|
|
"@remotion/cli": "^4.0.414",
|
|
"@remotion/lottie": "^4.0.414",
|
|
"@remotion/renderer": "^4.0.414",
|
|
"@remotion/tailwind": "^4.0.414",
|
|
"@sentry/core": "^10.38.0",
|
|
"@sentry/nextjs": "^10.38.0",
|
|
"@types/canvas-confetti": "^1.9.0",
|
|
"@types/ioredis": "^4.28.10",
|
|
"@types/react": "^19.2.8",
|
|
"@types/react-dom": "^19.2.3",
|
|
"@vercel/og": "^0.8.6",
|
|
"axios": "^1.13.4",
|
|
"canvas-confetti": "^1.9.4",
|
|
"clsx": "^2.1.1",
|
|
"crawlee": "^3.15.3",
|
|
"dotenv": "^17.3.1",
|
|
"esbuild": "^0.27.3",
|
|
"framer-motion": "^12.29.2",
|
|
"graphql": "^16.12.0",
|
|
"gray-matter": "^4.0.3",
|
|
"html-to-image": "^1.11.13",
|
|
"import-in-the-middle": "^1.11.0",
|
|
"ioredis": "^5.9.1",
|
|
"lucide-react": "^0.468.0",
|
|
"mermaid": "^11.12.2",
|
|
"next": "^16.1.6",
|
|
"next-mdx-remote": "^6.0.0",
|
|
"nodemailer": "^8.0.1",
|
|
"playwright": "^1.58.1",
|
|
"prismjs": "^1.30.0",
|
|
"puppeteer": "^24.36.1",
|
|
"qrcode": "^1.5.4",
|
|
"react": "^19.2.3",
|
|
"react-dom": "^19.2.3",
|
|
"react-social-media-embed": "^2.5.18",
|
|
"react-tweet": "^3.3.0",
|
|
"recharts": "^3.7.0",
|
|
"remotion": "^4.0.414",
|
|
"replicate": "^1.4.0",
|
|
"require-in-the-middle": "^8.0.1",
|
|
"sharp": "^0.34.5",
|
|
"shiki": "^1.24.2",
|
|
"tailwind-merge": "^3.4.0",
|
|
"tailwindcss": "^3.4.0",
|
|
"webpack": "^5.96.1",
|
|
"website-scraper": "^6.0.0",
|
|
"website-scraper-puppeteer": "^2.0.0",
|
|
"xlsx": "^0.18.5",
|
|
"zod": "^3.25.76"
|
|
},
|
|
"devDependencies": {
|
|
"@eslint/eslintrc": "^3.3.3",
|
|
"@eslint/js": "^10.0.0",
|
|
"@lhci/cli": "^0.15.1",
|
|
"@mintel/cli": "^1.9.0",
|
|
"@mintel/eslint-config": "^1.9.0",
|
|
"@mintel/husky-config": "^1.9.0",
|
|
"@mintel/next-config": "^1.9.0",
|
|
"@mintel/next-utils": "^1.9.0",
|
|
"@mintel/tsconfig": "^1.9.0",
|
|
"@next/eslint-plugin-next": "^16.1.6",
|
|
"@stryker-mutator/core": "^10.0.0",
|
|
"@stryker-mutator/typescript-checker": "^10.0.0",
|
|
"@stryker-mutator/vitest-runner": "^10.0.0",
|
|
"@tailwindcss/typography": "^0.5.15",
|
|
"@types/mime-types": "^3.0.1",
|
|
"@types/node": "^25.0.6",
|
|
"@types/nodemailer": "^7.0.10",
|
|
"@types/prismjs": "^1.26.5",
|
|
"@types/qrcode": "^1.5.6",
|
|
"@vitest/coverage-v8": "^4.1.11",
|
|
"autoprefixer": "^10.4.20",
|
|
"cheerio": "^1.1.2",
|
|
"concurrently": "^9.2.1",
|
|
"eslint": "10.0.0",
|
|
"eslint-plugin-react": "^7.37.5",
|
|
"eslint-plugin-react-hooks": "^7.0.1",
|
|
"mime-types": "^3.0.2",
|
|
"postcss": "^8.4.49",
|
|
"require-extensions": "^0.0.4",
|
|
"tsx": "^4.21.0",
|
|
"typescript": "5.9.3",
|
|
"typescript-eslint": "^8.54.0",
|
|
"vitest": "^4.1.11"
|
|
},
|
|
"repository": {
|
|
"type": "git",
|
|
"url": "git@git.infra.mintel.me:mmintel/mintel.me.git"
|
|
}
|
|
}
|