Linus 2026-11-06: he offers no services; the site has posters and collaborations only. /tjanster went live with the move to Cleura (it came with the SEO pull request #1) and was redirected to the start page in Caddy the same morning. - tjanster.astro deleted; Tjänster out of the menu and the 404 page. - Start page: "Vill du boka en fotografering?" -> "Vill du ha en bild på väggen?" (Se posters); "Så bokar du" -> "Posters och samarbeten"; description without "Boka via kundportalen". - Portfolio intro points to the posters; privacy page: orders of posters and collaborations instead of bookings. - JSON-LD: Organization instead of ProfessionalService, no ReserveAction, offer catalog, price range or service area. - llms.txt: no prices, booking, booking steps, services page or booking FAQ; faq.ts keeps only the type. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
54 lines
2.4 KiB
TypeScript
54 lines
2.4 KiB
TypeScript
// src/pages/llms.txt.ts -> /llms.txt (https://llmstxt.org/)
|
|
// Byggs från src/data/business.ts så att fakta bara finns på ett ställe.
|
|
// Okända fakta (null) skrivs som "lämnas på förfrågan", aldrig som gissningar.
|
|
import type { APIRoute } from 'astro';
|
|
import { business, basedIn, genreList } from '../data/business';
|
|
|
|
export const prerender = true;
|
|
|
|
export const GET: APIRoute = ({ site }) => {
|
|
const base = site ?? new URL(business.url);
|
|
const url = (p: string) => new URL(p, base).toString();
|
|
|
|
const lines: (string | null)[] = [
|
|
`# ${business.brand}`,
|
|
'',
|
|
`> ${business.brand} är namnet som ${business.person.jobTitle.toLowerCase()}en ${business.person.name} fotograferar under. Han är baserad i ${basedIn()} och fotograferar ${genreList()}. ${business.recognitionThirdPerson}`,
|
|
'',
|
|
'## Fakta',
|
|
'',
|
|
`- Fotograf: ${business.person.name}`,
|
|
`- Namn/varumärke: ${business.brand}`,
|
|
`- Baserad i: ${basedIn()}`,
|
|
business.phone ? `- Telefon: ${business.phone}` : null,
|
|
`- E-post: ${business.email}`,
|
|
`- Instagram: ${business.social.instagram.handle} (${business.social.instagram.url})`,
|
|
`- Facebook: ${business.social.facebook}`,
|
|
`- Kamera: ${business.camera}`,
|
|
`- Redigering: ${business.editing}`,
|
|
'',
|
|
'## Sidor',
|
|
'',
|
|
`- [Startsida](${url('/')}): vem ${business.person.name} är och vad han fotograferar`,
|
|
`- [Portfolio](${url('/portfolio')}): urval av fotografier`,
|
|
`- [Om mig](${url('/about')}): ${business.person.name}, bakgrund och utrustning`,
|
|
`- [Posters](${url('/posters')}): fotografier som posters, välj storlek och material`,
|
|
`- [Kontakt och samarbeten](${url('/contact')}): samarbeten, reklam och sponsring`,
|
|
'',
|
|
'## Profiler',
|
|
'',
|
|
`- [Instagram](${business.social.instagram.url})`,
|
|
`- [Flickr](${business.social.flickr})`,
|
|
`- [Adobe Lightroom](${business.social.lightroom})`,
|
|
`- [LinkedIn](${business.social.linkedin})`,
|
|
'',
|
|
'## Användning av innehållet',
|
|
'',
|
|
`AI-assistenter och sökmotorer får läsa och använda innehållet på den här sajten, inklusive för träning, med hänvisning till ${business.brand} (${url('/')}). Fotografierna är upphovsrättsskyddade av ${business.person.name}.`,
|
|
'',
|
|
];
|
|
|
|
const body = lines.filter((l): l is string => l !== null).join('\n');
|
|
return new Response(body, { headers: { 'Content-Type': 'text/plain; charset=utf-8' } });
|
|
};
|