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>
63 lines
1.6 KiB
JavaScript
63 lines
1.6 KiB
JavaScript
import withMintelConfig from "@mintel/next-config";
|
|
|
|
import path from 'path';
|
|
import { fileURLToPath } from 'url';
|
|
|
|
const filename = fileURLToPath(import.meta.url);
|
|
const dirname = path.dirname(filename);
|
|
|
|
/** @type {import('next').NextConfig} */
|
|
const nextConfig = {
|
|
serverExternalPackages: [
|
|
'canvas',
|
|
'sharp',
|
|
'puppeteer',
|
|
'require-in-the-middle',
|
|
'import-in-the-middle'
|
|
],
|
|
images: {
|
|
remotePatterns: [
|
|
{
|
|
protocol: 'https',
|
|
hostname: '*.your-objectstorage.com',
|
|
},
|
|
{
|
|
protocol: 'https',
|
|
hostname: 'fsn1.your-objectstorage.com',
|
|
},
|
|
],
|
|
},
|
|
// The site is a single page. Old URLs from the previous site lead to it.
|
|
async redirects() {
|
|
return [
|
|
"/about",
|
|
"/process",
|
|
"/notes/:path*",
|
|
"/book",
|
|
"/contact",
|
|
"/websites",
|
|
"/blog/:path*",
|
|
"/case-studies/:path*",
|
|
"/technologies/:path*",
|
|
"/tags/:path*",
|
|
]
|
|
.map((source) => ({ source, destination: "/", permanent: true }))
|
|
.concat([
|
|
{ source: "/impressum", destination: "/imprint", permanent: true },
|
|
{ source: "/datenschutz", destination: "/privacy", permanent: true },
|
|
]);
|
|
},
|
|
// In Standalone mode, Next.js expects the tracing root to be the monorepo root
|
|
outputFileTracingRoot: path.join(dirname, '../../'),
|
|
};
|
|
|
|
// Clean, standard wrapper application
|
|
const config = withMintelConfig(nextConfig);
|
|
|
|
// Cleanup config to prevent Next.js 16 warnings about deprecated keys
|
|
if (config.serverActions) {
|
|
delete config.serverActions;
|
|
}
|
|
|
|
export default config;
|