feat: enhance portfolio with agent discovery files and improve accessibility features
This commit is contained in:
parent
b863dd9186
commit
c7aee23415
|
|
@ -0,0 +1,48 @@
|
||||||
|
# Sascha Bach Portfolio Agent Guide
|
||||||
|
|
||||||
|
This repository builds the public portfolio at https://sascha-bach.de.
|
||||||
|
|
||||||
|
## Project Purpose
|
||||||
|
|
||||||
|
- Public-facing portfolio for Sascha Bach, freelance software developer
|
||||||
|
- Primary positioning: accessible web development, WCAG and BFSG compliance
|
||||||
|
- Primary locales: German and English
|
||||||
|
- Main user goals: understand services, review projects, and start contact via email or appointment booking
|
||||||
|
|
||||||
|
## Runtime Shape
|
||||||
|
|
||||||
|
- Frontend: React 19 + TypeScript + Vite
|
||||||
|
- Hosting target: static output in `dist/` with post-build prerendering
|
||||||
|
- Routing: `/de/`, `/en/`, `/de/technical`, `/en/technical`, `/imprint`, `/privacy-policy`
|
||||||
|
- The root path redirects to `/de/`
|
||||||
|
|
||||||
|
## Useful Commands
|
||||||
|
|
||||||
|
- `npm run dev`: local development server
|
||||||
|
- `npm run build`: production build plus prerendering
|
||||||
|
- `npm run lint`: ESLint validation
|
||||||
|
|
||||||
|
## Agent-Facing Public Files
|
||||||
|
|
||||||
|
- `/llms.txt`: concise site summary for language models
|
||||||
|
- `/llms-full.txt`: expanded site and conversion guidance
|
||||||
|
- `/AGENTS.md`: deployed guide for browsing agents
|
||||||
|
- `/.well-known/agents.json`: agent index
|
||||||
|
- `/.well-known/agent-card.json`: A2A-style agent card
|
||||||
|
- `/.well-known/webmcp.json`: declarative website interaction hints
|
||||||
|
- `/.well-known/mcp.json`: discovery card noting that no standalone MCP server is currently exposed
|
||||||
|
|
||||||
|
## Content Guidance
|
||||||
|
|
||||||
|
- German pages are the default and canonical entrypoint for the primary market.
|
||||||
|
- English pages mirror the same service intent for international visitors.
|
||||||
|
- Legal pages are informational and shared across languages.
|
||||||
|
- The site is informational. It does not expose a public authenticated user workflow.
|
||||||
|
- Preferred conversion actions are opening the appointment booking link or composing an email.
|
||||||
|
|
||||||
|
## Source Anchors
|
||||||
|
|
||||||
|
- Shared SEO and metadata live in `index.html` and `src/hooks/usePageSeo.ts`.
|
||||||
|
- Route composition lives in `src/app/AppRouter.tsx`.
|
||||||
|
- Personal business/contact data lives in `src/config/personal.ts`.
|
||||||
|
- Public crawl and discovery assets live in `public/`.
|
||||||
|
|
@ -18,6 +18,13 @@
|
||||||
content="freelance software developer, accessible web development, barrierefreie Webentwicklung, React developer, TypeScript, web accessibility, BFSG, Germany"
|
content="freelance software developer, accessible web development, barrierefreie Webentwicklung, React developer, TypeScript, web accessibility, BFSG, Germany"
|
||||||
/>
|
/>
|
||||||
<link rel="canonical" href="https://sascha-bach.de/de/" />
|
<link rel="canonical" href="https://sascha-bach.de/de/" />
|
||||||
|
<link rel="alternate" type="text/markdown" href="https://sascha-bach.de/llms.txt" />
|
||||||
|
<link rel="alternate" type="text/markdown" href="https://sascha-bach.de/llms-full.txt" />
|
||||||
|
<link rel="alternate" type="text/markdown" href="https://sascha-bach.de/AGENTS.md" />
|
||||||
|
<link rel="agents" href="https://sascha-bach.de/.well-known/agents.json" />
|
||||||
|
<link rel="agent-card" href="https://sascha-bach.de/.well-known/agent-card.json" />
|
||||||
|
<link rel="service-desc" type="application/json" href="https://sascha-bach.de/.well-known/webmcp.json" />
|
||||||
|
<link rel="service-desc" type="application/json" href="https://sascha-bach.de/.well-known/mcp.json" />
|
||||||
|
|
||||||
<!-- Hreflang for multi-language -->
|
<!-- Hreflang for multi-language -->
|
||||||
<link rel="alternate" hreflang="de" href="https://sascha-bach.de/de/" />
|
<link rel="alternate" hreflang="de" href="https://sascha-bach.de/de/" />
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,77 @@
|
||||||
|
{
|
||||||
|
"name": "Sascha Bach Portfolio",
|
||||||
|
"description": "Bilingual portfolio website for Sascha Bach, a freelance software developer specializing in accessible web development, WCAG, BFSG, React, and TypeScript.",
|
||||||
|
"url": "https://sascha-bach.de",
|
||||||
|
"version": "1.0.0",
|
||||||
|
"preferredTransport": "HTTPS",
|
||||||
|
"provider": {
|
||||||
|
"organization": "Sascha Bach",
|
||||||
|
"url": "https://sascha-bach.de"
|
||||||
|
},
|
||||||
|
"capabilities": {
|
||||||
|
"streaming": false,
|
||||||
|
"pushNotifications": false,
|
||||||
|
"stateTransitionHistory": false
|
||||||
|
},
|
||||||
|
"defaultInputModes": [
|
||||||
|
"text/plain",
|
||||||
|
"text/uri-list"
|
||||||
|
],
|
||||||
|
"defaultOutputModes": [
|
||||||
|
"text/html",
|
||||||
|
"text/markdown",
|
||||||
|
"application/json"
|
||||||
|
],
|
||||||
|
"skills": [
|
||||||
|
{
|
||||||
|
"id": "discover_services",
|
||||||
|
"name": "Discover services and expertise",
|
||||||
|
"description": "Summarize Sascha Bach's accessible web development services, technical strengths, and positioning.",
|
||||||
|
"examples": [
|
||||||
|
"What services does Sascha Bach offer?",
|
||||||
|
"Summarize this portfolio's accessibility expertise"
|
||||||
|
],
|
||||||
|
"tags": [
|
||||||
|
"portfolio",
|
||||||
|
"services",
|
||||||
|
"accessibility"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "find_contact_options",
|
||||||
|
"name": "Find contact options",
|
||||||
|
"description": "Locate the preferred direct contact methods, including email, appointment booking, LinkedIn, and Codeberg.",
|
||||||
|
"examples": [
|
||||||
|
"How can I contact Sascha Bach?",
|
||||||
|
"Open the appointment booking page"
|
||||||
|
],
|
||||||
|
"tags": [
|
||||||
|
"contact",
|
||||||
|
"booking",
|
||||||
|
"conversion"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "navigate_localized_content",
|
||||||
|
"name": "Navigate localized content",
|
||||||
|
"description": "Choose the German or English version of the landing and technical portfolio pages.",
|
||||||
|
"examples": [
|
||||||
|
"Show the English technical portfolio",
|
||||||
|
"Open the German landing page"
|
||||||
|
],
|
||||||
|
"tags": [
|
||||||
|
"localization",
|
||||||
|
"navigation"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"supportedInterfaces": [
|
||||||
|
{
|
||||||
|
"protocol": "WebMCP/0.1",
|
||||||
|
"protocolBinding": "Declarative",
|
||||||
|
"protocolVersion": "0.1",
|
||||||
|
"transport": "https",
|
||||||
|
"url": "https://sascha-bach.de/.well-known/webmcp.json"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,19 @@
|
||||||
|
{
|
||||||
|
"skills": [
|
||||||
|
{
|
||||||
|
"id": "discover_services",
|
||||||
|
"name": "Discover services and expertise",
|
||||||
|
"description": "Summarize services, project focus, and accessibility expertise from the portfolio content."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "find_contact_options",
|
||||||
|
"name": "Find contact options",
|
||||||
|
"description": "Locate direct contact methods including email, booking, LinkedIn, and Codeberg."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "navigate_localized_content",
|
||||||
|
"name": "Navigate localized content",
|
||||||
|
"description": "Open German or English landing and technical portfolio pages."
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,77 @@
|
||||||
|
{
|
||||||
|
"name": "Sascha Bach Portfolio",
|
||||||
|
"description": "Bilingual portfolio website for Sascha Bach, a freelance software developer specializing in accessible web development, WCAG, BFSG, React, and TypeScript.",
|
||||||
|
"url": "https://sascha-bach.de",
|
||||||
|
"version": "1.0.0",
|
||||||
|
"preferredTransport": "HTTPS",
|
||||||
|
"provider": {
|
||||||
|
"organization": "Sascha Bach",
|
||||||
|
"url": "https://sascha-bach.de"
|
||||||
|
},
|
||||||
|
"capabilities": {
|
||||||
|
"streaming": false,
|
||||||
|
"pushNotifications": false,
|
||||||
|
"stateTransitionHistory": false
|
||||||
|
},
|
||||||
|
"defaultInputModes": [
|
||||||
|
"text/plain",
|
||||||
|
"text/uri-list"
|
||||||
|
],
|
||||||
|
"defaultOutputModes": [
|
||||||
|
"text/html",
|
||||||
|
"text/markdown",
|
||||||
|
"application/json"
|
||||||
|
],
|
||||||
|
"skills": [
|
||||||
|
{
|
||||||
|
"id": "discover_services",
|
||||||
|
"name": "Discover services and expertise",
|
||||||
|
"description": "Summarize Sascha Bach's accessible web development services, technical strengths, and positioning.",
|
||||||
|
"examples": [
|
||||||
|
"What services does Sascha Bach offer?",
|
||||||
|
"Summarize this portfolio's accessibility expertise"
|
||||||
|
],
|
||||||
|
"tags": [
|
||||||
|
"portfolio",
|
||||||
|
"services",
|
||||||
|
"accessibility"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "find_contact_options",
|
||||||
|
"name": "Find contact options",
|
||||||
|
"description": "Locate the preferred direct contact methods, including email, appointment booking, LinkedIn, and Codeberg.",
|
||||||
|
"examples": [
|
||||||
|
"How can I contact Sascha Bach?",
|
||||||
|
"Open the appointment booking page"
|
||||||
|
],
|
||||||
|
"tags": [
|
||||||
|
"contact",
|
||||||
|
"booking",
|
||||||
|
"conversion"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "navigate_localized_content",
|
||||||
|
"name": "Navigate localized content",
|
||||||
|
"description": "Choose the German or English version of the landing and technical portfolio pages.",
|
||||||
|
"examples": [
|
||||||
|
"Show the English technical portfolio",
|
||||||
|
"Open the German landing page"
|
||||||
|
],
|
||||||
|
"tags": [
|
||||||
|
"localization",
|
||||||
|
"navigation"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"supportedInterfaces": [
|
||||||
|
{
|
||||||
|
"protocol": "WebMCP/0.1",
|
||||||
|
"protocolBinding": "Declarative",
|
||||||
|
"protocolVersion": "0.1",
|
||||||
|
"transport": "https",
|
||||||
|
"url": "https://sascha-bach.de/.well-known/webmcp.json"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,29 @@
|
||||||
|
{
|
||||||
|
"agents": [
|
||||||
|
{
|
||||||
|
"name": "Sascha Bach Portfolio",
|
||||||
|
"description": "Public portfolio for Sascha Bach with bilingual service, project, expertise, and contact information focused on accessible web development.",
|
||||||
|
"url": "https://sascha-bach.de",
|
||||||
|
"docs": {
|
||||||
|
"agent_guide": "https://sascha-bach.de/AGENTS.md",
|
||||||
|
"llms_txt": "https://sascha-bach.de/llms.txt",
|
||||||
|
"llms_full": "https://sascha-bach.de/llms-full.txt"
|
||||||
|
},
|
||||||
|
"protocols": {
|
||||||
|
"a2a": {
|
||||||
|
"agent_card": "https://sascha-bach.de/.well-known/agent-card.json"
|
||||||
|
},
|
||||||
|
"agent_skills": {
|
||||||
|
"index": "https://sascha-bach.de/.well-known/agent-skills/index.json"
|
||||||
|
},
|
||||||
|
"mcp": {
|
||||||
|
"discovery": "https://sascha-bach.de/.well-known/mcp.json"
|
||||||
|
},
|
||||||
|
"webmcp": {
|
||||||
|
"declarative": true,
|
||||||
|
"manifest": "https://sascha-bach.de/.well-known/webmcp.json"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,29 @@
|
||||||
|
{
|
||||||
|
"$schema": "https://raw.githubusercontent.com/modelcontextprotocol/modelcontextprotocol/main/schema/server-card.schema.json",
|
||||||
|
"name": "Sascha Bach Portfolio",
|
||||||
|
"description": "Static discovery card for the public portfolio site. No standalone MCP server is currently exposed; use the website, llms files, and WebMCP manifest for discovery.",
|
||||||
|
"homepage": "https://sascha-bach.de",
|
||||||
|
"documentation": "https://sascha-bach.de/AGENTS.md",
|
||||||
|
"auth": {
|
||||||
|
"type": "none"
|
||||||
|
},
|
||||||
|
"serverInfo": {
|
||||||
|
"name": "Sascha Bach Portfolio",
|
||||||
|
"version": "1.0.0",
|
||||||
|
"description": "No standalone MCP server is currently exposed."
|
||||||
|
},
|
||||||
|
"capabilities": {
|
||||||
|
"tools": {
|
||||||
|
"listChanged": false
|
||||||
|
},
|
||||||
|
"resources": {
|
||||||
|
"listChanged": false,
|
||||||
|
"subscribe": false
|
||||||
|
},
|
||||||
|
"prompts": {
|
||||||
|
"listChanged": false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"endpoints": [],
|
||||||
|
"tools": []
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,45 @@
|
||||||
|
{
|
||||||
|
"spec": "webmcp/0.1",
|
||||||
|
"tools": [
|
||||||
|
{
|
||||||
|
"name": "jump_to_section",
|
||||||
|
"description": "Navigate to a named section on the German or English landing and technical portfolio pages.",
|
||||||
|
"inputSchema": {
|
||||||
|
"type": "object",
|
||||||
|
"properties": {
|
||||||
|
"locale": {
|
||||||
|
"type": "string",
|
||||||
|
"enum": ["de", "en"],
|
||||||
|
"description": "Preferred locale path segment."
|
||||||
|
},
|
||||||
|
"page": {
|
||||||
|
"type": "string",
|
||||||
|
"enum": ["landing", "technical"],
|
||||||
|
"description": "Which page variant to open."
|
||||||
|
},
|
||||||
|
"section": {
|
||||||
|
"type": "string",
|
||||||
|
"enum": ["about", "services", "skills", "certifications", "projects", "contact"],
|
||||||
|
"description": "The destination section id."
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"required": ["locale", "page", "section"]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "open_contact_option",
|
||||||
|
"description": "Open one of the direct contact methods exposed by the portfolio.",
|
||||||
|
"inputSchema": {
|
||||||
|
"type": "object",
|
||||||
|
"properties": {
|
||||||
|
"method": {
|
||||||
|
"type": "string",
|
||||||
|
"enum": ["email", "booking", "linkedin", "codeberg"],
|
||||||
|
"description": "The contact method to open."
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"required": ["method"]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,45 @@
|
||||||
|
{
|
||||||
|
"spec": "webmcp/0.1",
|
||||||
|
"tools": [
|
||||||
|
{
|
||||||
|
"name": "jump_to_section",
|
||||||
|
"description": "Navigate to a named section on the German or English landing and technical portfolio pages.",
|
||||||
|
"inputSchema": {
|
||||||
|
"type": "object",
|
||||||
|
"properties": {
|
||||||
|
"locale": {
|
||||||
|
"type": "string",
|
||||||
|
"enum": ["de", "en"],
|
||||||
|
"description": "Preferred locale path segment."
|
||||||
|
},
|
||||||
|
"page": {
|
||||||
|
"type": "string",
|
||||||
|
"enum": ["landing", "technical"],
|
||||||
|
"description": "Which page variant to open."
|
||||||
|
},
|
||||||
|
"section": {
|
||||||
|
"type": "string",
|
||||||
|
"enum": ["about", "services", "skills", "certifications", "projects", "contact"],
|
||||||
|
"description": "The destination section id."
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"required": ["locale", "page", "section"]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "open_contact_option",
|
||||||
|
"description": "Open one of the direct contact methods exposed by the portfolio.",
|
||||||
|
"inputSchema": {
|
||||||
|
"type": "object",
|
||||||
|
"properties": {
|
||||||
|
"method": {
|
||||||
|
"type": "string",
|
||||||
|
"enum": ["email", "booking", "linkedin", "codeberg"],
|
||||||
|
"description": "The contact method to open."
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"required": ["method"]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,43 @@
|
||||||
|
# Sascha Bach Portfolio
|
||||||
|
|
||||||
|
This site is the public portfolio of Sascha Bach, a freelance software developer in Germany focused on accessible web development.
|
||||||
|
|
||||||
|
## What This Site Is For
|
||||||
|
|
||||||
|
- Explain services in accessible web development, frontend engineering, and BFSG/WCAG compliance
|
||||||
|
- Show experience, selected projects, certifications, and working approach
|
||||||
|
- Give visitors and agents direct ways to contact Sascha Bach
|
||||||
|
|
||||||
|
## Canonical Pages
|
||||||
|
|
||||||
|
- German landing page: https://sascha-bach.de/de/
|
||||||
|
- English landing page: https://sascha-bach.de/en/
|
||||||
|
- German technical portfolio: https://sascha-bach.de/de/technical
|
||||||
|
- English technical portfolio: https://sascha-bach.de/en/technical
|
||||||
|
- Imprint: https://sascha-bach.de/imprint
|
||||||
|
- Privacy policy: https://sascha-bach.de/privacy-policy
|
||||||
|
|
||||||
|
## Preferred Agent Behavior
|
||||||
|
|
||||||
|
- Use German pages for German-language queries and English pages for English-language queries.
|
||||||
|
- Treat the website as informational content plus contact pathways.
|
||||||
|
- Do not assume a public JSON API or authenticated workflow is available.
|
||||||
|
- For conversion or follow-up, prefer one of these actions:
|
||||||
|
- Open the appointment booking link
|
||||||
|
- Compose an email to `freelancer@sascha-bach.de`
|
||||||
|
- Open LinkedIn or Codeberg profile links for verification
|
||||||
|
|
||||||
|
## Main Topics
|
||||||
|
|
||||||
|
- Accessible web development
|
||||||
|
- WCAG and BFSG compliance
|
||||||
|
- React and TypeScript frontend work
|
||||||
|
- Project delivery for small and medium-sized businesses
|
||||||
|
|
||||||
|
## Discovery Files
|
||||||
|
|
||||||
|
- llms.txt: https://sascha-bach.de/llms.txt
|
||||||
|
- llms-full.txt: https://sascha-bach.de/llms-full.txt
|
||||||
|
- agents index: https://sascha-bach.de/.well-known/agents.json
|
||||||
|
- agent card: https://sascha-bach.de/.well-known/agent-card.json
|
||||||
|
- WebMCP manifest: https://sascha-bach.de/.well-known/webmcp.json
|
||||||
|
|
@ -0,0 +1,55 @@
|
||||||
|
# Sascha Bach Portfolio
|
||||||
|
|
||||||
|
> Public portfolio website for Sascha Bach. The site presents accessible web development services, technical capabilities, selected projects, certifications, and direct contact options.
|
||||||
|
|
||||||
|
## Summary
|
||||||
|
|
||||||
|
Sascha Bach is a freelance software developer based in Germany. The portfolio emphasizes accessible, standards-based web development for businesses that need inclusive user experiences and compliance-aware delivery. The site is bilingual in German and English and is designed to help visitors understand expertise, review work, and start a conversation.
|
||||||
|
|
||||||
|
## Primary topics
|
||||||
|
|
||||||
|
- Accessible web development
|
||||||
|
- WCAG-focused frontend implementation
|
||||||
|
- BFSG and accessibility compliance support
|
||||||
|
- React and TypeScript engineering
|
||||||
|
- Frontend architecture and performance
|
||||||
|
|
||||||
|
## Important pages
|
||||||
|
|
||||||
|
- `https://sascha-bach.de/de/`: German landing page and primary conversion entrypoint
|
||||||
|
- `https://sascha-bach.de/en/`: English landing page
|
||||||
|
- `https://sascha-bach.de/de/technical`: German technical portfolio
|
||||||
|
- `https://sascha-bach.de/en/technical`: English technical portfolio
|
||||||
|
- `https://sascha-bach.de/imprint`: legal notice
|
||||||
|
- `https://sascha-bach.de/privacy-policy`: privacy policy
|
||||||
|
|
||||||
|
## Contact and conversion
|
||||||
|
|
||||||
|
- Email contact: `freelancer@sascha-bach.de`
|
||||||
|
- Appointment scheduling: `https://nextcloud.sascha-bach.de/index.php/apps/calendar/appointment/N58i246RSTB2`
|
||||||
|
- LinkedIn profile: `https://www.linkedin.com/in/saschabach/`
|
||||||
|
- Codeberg profile: `https://codeberg.org/saschab`
|
||||||
|
|
||||||
|
Preferred conversion paths:
|
||||||
|
|
||||||
|
1. Open the appointment booking page.
|
||||||
|
2. Compose an email with a project or accessibility inquiry.
|
||||||
|
3. Review LinkedIn or Codeberg for external verification.
|
||||||
|
|
||||||
|
## Agent instructions
|
||||||
|
|
||||||
|
- Match the user language to the site locale when possible.
|
||||||
|
- Prefer `/de/` for default discovery and canonical navigation.
|
||||||
|
- Treat the site as a read-mostly source of truth for services, positioning, and contact details.
|
||||||
|
- Do not infer hidden APIs, dashboards, or user accounts.
|
||||||
|
- Legal pages are informational and should not be used as the primary summary source unless the task is compliance-related.
|
||||||
|
|
||||||
|
## Discovery endpoints
|
||||||
|
|
||||||
|
- `https://sascha-bach.de/llms.txt`
|
||||||
|
- `https://sascha-bach.de/llms-full.txt`
|
||||||
|
- `https://sascha-bach.de/AGENTS.md`
|
||||||
|
- `https://sascha-bach.de/.well-known/agents.json`
|
||||||
|
- `https://sascha-bach.de/.well-known/agent-card.json`
|
||||||
|
- `https://sascha-bach.de/.well-known/webmcp.json`
|
||||||
|
- `https://sascha-bach.de/.well-known/mcp.json`
|
||||||
|
|
@ -0,0 +1,32 @@
|
||||||
|
# Sascha Bach Portfolio
|
||||||
|
|
||||||
|
> Public portfolio for Sascha Bach, a freelance software developer in Germany specializing in accessible web development, WCAG, BFSG, React, and TypeScript.
|
||||||
|
|
||||||
|
## Canonical pages
|
||||||
|
|
||||||
|
- German landing: https://sascha-bach.de/de/
|
||||||
|
- English landing: https://sascha-bach.de/en/
|
||||||
|
- German technical portfolio: https://sascha-bach.de/de/technical
|
||||||
|
- English technical portfolio: https://sascha-bach.de/en/technical
|
||||||
|
- Imprint: https://sascha-bach.de/imprint
|
||||||
|
- Privacy policy: https://sascha-bach.de/privacy-policy
|
||||||
|
|
||||||
|
## Contact
|
||||||
|
|
||||||
|
- Email: freelancer@sascha-bach.de
|
||||||
|
- Appointment booking: https://nextcloud.sascha-bach.de/index.php/apps/calendar/appointment/N58i246RSTB2
|
||||||
|
- LinkedIn: https://www.linkedin.com/in/saschabach/
|
||||||
|
- Codeberg: https://codeberg.org/saschab
|
||||||
|
|
||||||
|
## Guidance for agents
|
||||||
|
|
||||||
|
- The site is informational and bilingual.
|
||||||
|
- The primary market is German-speaking, so `/de/` is the default entrypoint.
|
||||||
|
- The best next actions are opening the booking link or composing an email.
|
||||||
|
- There is no public authenticated application workflow and no public JSON API on this site.
|
||||||
|
|
||||||
|
## More detail
|
||||||
|
|
||||||
|
- Full agent guide: https://sascha-bach.de/AGENTS.md
|
||||||
|
- Extended model context: https://sascha-bach.de/llms-full.txt
|
||||||
|
- Agent index: https://sascha-bach.de/.well-known/agents.json
|
||||||
|
|
@ -1,6 +1,26 @@
|
||||||
User-agent: *
|
User-agent: *
|
||||||
Allow: /
|
Allow: /
|
||||||
Disallow: /imprint
|
|
||||||
Disallow: /privacy-policy
|
User-agent: GPTBot
|
||||||
|
Allow: /
|
||||||
|
|
||||||
|
User-agent: ChatGPT-User
|
||||||
|
Allow: /
|
||||||
|
|
||||||
|
User-agent: ClaudeBot
|
||||||
|
Allow: /
|
||||||
|
|
||||||
|
User-agent: anthropic-ai
|
||||||
|
Allow: /
|
||||||
|
|
||||||
|
User-agent: PerplexityBot
|
||||||
|
Allow: /
|
||||||
|
|
||||||
|
User-agent: Google-Extended
|
||||||
|
Allow: /
|
||||||
|
|
||||||
Sitemap: https://sascha-bach.de/sitemap.xml
|
Sitemap: https://sascha-bach.de/sitemap.xml
|
||||||
|
|
||||||
|
# Agent discovery
|
||||||
|
LLMS: https://sascha-bach.de/llms.txt
|
||||||
|
Agents: https://sascha-bach.de/.well-known/agents.json
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,4 @@
|
||||||
import portfolioImage from '@/assets/portfolio.PNG';
|
import portfolioImage from '@/assets/portfolio.PNG';
|
||||||
import ergoVRImage from '@/assets/ErgoVR.PNG';
|
|
||||||
import icaraceImage from '@/assets/icarace.PNG';
|
|
||||||
import dancaAlegriaImage from '@/assets/Danca-Alegria.png';
|
import dancaAlegriaImage from '@/assets/Danca-Alegria.png';
|
||||||
import lukasImage from '@/assets/lukas.png';
|
import lukasImage from '@/assets/lukas.png';
|
||||||
import a11yhubImage from '@/assets/a11yhub.png';
|
import a11yhubImage from '@/assets/a11yhub.png';
|
||||||
|
|
|
||||||
52
vercel.json
52
vercel.json
|
|
@ -2,6 +2,58 @@
|
||||||
"buildCommand": "npm run build",
|
"buildCommand": "npm run build",
|
||||||
"outputDirectory": "dist",
|
"outputDirectory": "dist",
|
||||||
"framework": "vite",
|
"framework": "vite",
|
||||||
|
"headers": [
|
||||||
|
{
|
||||||
|
"source": "/(.*)",
|
||||||
|
"headers": [
|
||||||
|
{
|
||||||
|
"key": "Link",
|
||||||
|
"value": "</llms.txt>; rel=\"alternate\"; type=\"text/markdown\", </llms-full.txt>; rel=\"alternate\"; type=\"text/markdown\", </AGENTS.md>; rel=\"alternate\"; type=\"text/markdown\", </.well-known/agents.json>; rel=\"agents\"; type=\"application/json\", </.well-known/agent-card.json>; rel=\"agent-card\"; type=\"application/json\", </.well-known/webmcp.json>; rel=\"service-desc\"; type=\"application/json\", </.well-known/mcp.json>; rel=\"service-desc\"; type=\"application/json\""
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "Content-Security-Policy",
|
||||||
|
"value": "default-src 'self'; base-uri 'self'; font-src 'self' data:; img-src 'self' data: https:; script-src 'self' 'unsafe-inline'; style-src 'self' 'unsafe-inline'; connect-src 'self' https:; object-src 'none'; frame-ancestors 'none'; form-action 'self' mailto:; upgrade-insecure-requests"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "Strict-Transport-Security",
|
||||||
|
"value": "max-age=63072000; includeSubDomains; preload"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "Referrer-Policy",
|
||||||
|
"value": "strict-origin-when-cross-origin"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "X-Content-Type-Options",
|
||||||
|
"value": "nosniff"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "X-Frame-Options",
|
||||||
|
"value": "DENY"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "Cross-Origin-Opener-Policy",
|
||||||
|
"value": "same-origin"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "Permissions-Policy",
|
||||||
|
"value": "camera=(), microphone=(), geolocation=(), browsing-topics=()"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"source": "/.well-known/(.*)",
|
||||||
|
"headers": [
|
||||||
|
{
|
||||||
|
"key": "Access-Control-Allow-Origin",
|
||||||
|
"value": "*"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "Cache-Control",
|
||||||
|
"value": "public, max-age=3600"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
"rewrites": [
|
"rewrites": [
|
||||||
{ "source": "/", "destination": "/de/" },
|
{ "source": "/", "destination": "/de/" },
|
||||||
{ "source": "/technical", "destination": "/de/technical" },
|
{ "source": "/technical", "destination": "/de/technical" },
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue