chore: archive inactive projects to apps-archived/

Move inactive projects out of active workspace:
- bauntown (community website)
- maerchenzauber (AI story generation)
- memoro (voice memo app)
- news (news aggregation)
- nutriphi (nutrition tracking)
- reader (reading app)
- uload (URL shortener)
- wisekeep (AI wisdom extraction)

Update CLAUDE.md documentation:
- Add presi to active projects
- Document archived projects section
- Update workspace configuration

Archived apps can be re-activated by moving back to apps/

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
Till-JS 2025-11-29 07:03:59 +01:00
parent b97149ac12
commit 61d181fbc2
3148 changed files with 437 additions and 46640 deletions

View file

@ -0,0 +1,684 @@
/**
* Reserved slugs that cannot be used for workspace URLs
* to prevent conflicts with system routes, common usernames,
* and potential brand confusion
*/
export const RESERVED_SLUGS = [
// uload specific routes
'uload',
'ulo',
'u',
'w',
'p',
'link',
'links',
'card',
'cards',
'workspace',
'workspaces',
'my',
'analytics',
'stats',
'statistics',
'click',
'clicks',
'qr',
'qrcode',
'preview',
'embed',
'widget',
'share',
'invite',
'invites',
'invitation',
'invitations',
'member',
'members',
'owner',
'owners',
// System/Admin routes
'admin',
'api',
'www',
'mail',
'support',
'help',
'docs',
'documentation',
'blog',
'legal',
'privacy',
'terms',
'tos',
'contact',
'about',
'pricing',
'prices',
'features',
'security',
'status',
'health',
'ping',
'webhook',
'webhooks',
'callback',
'auth',
'oauth',
'sso',
'login',
'logout',
'register',
'signup',
'signin',
'signout',
'dashboard',
'settings',
'preferences',
'profile',
'account',
'accounts',
'billing',
'subscription',
'subscriptions',
'plan',
'plans',
'upgrade',
'downgrade',
'cancel',
'delete',
'remove',
'edit',
'update',
'create',
'add',
'new',
'manage',
'management',
'admin-panel',
'control-panel',
'cpanel',
// Common service names
'cdn',
'assets',
'static',
'public',
'images',
'img',
'css',
'js',
'fonts',
'uploads',
'files',
'download',
'downloads',
'archive',
'backup',
'export',
'import',
'sync',
// Common usernames/brands
'admin',
'administrator',
'root',
'system',
'service',
'bot',
'user',
'users',
'team',
'teams',
'group',
'groups',
'org',
'organization',
'company',
'corp',
'inc',
'llc',
'gmbh',
'ag',
'sa',
'ltd',
'limited',
// Potential phishing/confusion - Tech Giants
'google',
'facebook',
'meta',
'twitter',
'x',
'instagram',
'threads',
'linkedin',
'github',
'gitlab',
'bitbucket',
'microsoft',
'windows',
'xbox',
'apple',
'iphone',
'ipad',
'mac',
'amazon',
'aws',
'netflix',
'spotify',
'slack',
'discord',
'telegram',
'whatsapp',
'signal',
'zoom',
'teams',
'skype',
'notion',
'trello',
'asana',
'jira',
'confluence',
'atlassian',
'adobe',
'figma',
'canva',
'dropbox',
'box',
'drive',
'onedrive',
'icloud',
'oracle',
'salesforce',
'hubspot',
'mailchimp',
'sendgrid',
'twilio',
'stripe',
'paypal',
'square',
'shopify',
'wix',
'wordpress',
'squarespace',
'godaddy',
'namecheap',
'cloudflare',
'vercel',
'netlify',
'heroku',
'digitalocean',
'linode',
'vultr',
'docker',
'kubernetes',
'redis',
'mongodb',
'postgres',
'mysql',
'firebase',
'supabase',
'openai',
'chatgpt',
'anthropic',
'claude',
'gemini',
'bard',
'copilot',
'midjourney',
'stability',
'huggingface',
// German companies/brands
'telekom',
'vodafone',
'o2',
'1und1',
'bmw',
'mercedes',
'mercedes-benz',
'volkswagen',
'vw',
'audi',
'porsche',
'opel',
'ford',
'tesla',
'siemens',
'sap',
'allianz',
'deutsche-bank',
'deutschebank',
'commerzbank',
'sparkasse',
'volksbank',
'postbank',
'dhl',
'dpd',
'ups',
'fedex',
'hermes',
'lufthansa',
'eurowings',
'ryanair',
'easyjet',
'adidas',
'puma',
'nike',
'reebok',
'bayer',
'basf',
'bosch',
'continental',
'thyssenkrupp',
'henkel',
'beiersdorf',
'nivea',
'hugo-boss',
'hugoboss',
'zalando',
'aboutyou',
'otto',
'lidl',
'aldi',
'edeka',
'rewe',
'penny',
'netto',
'kaufland',
'real',
'metro',
'saturn',
'mediamarkt',
'conrad',
'dm',
'rossmann',
'mueller',
'douglas',
'tchibo',
'ikea',
'hornbach',
'obi',
'bauhaus',
'toom',
'hagebau',
// Banks & Financial
'visa',
'mastercard',
'amex',
'americanexpress',
'discover',
'bank',
'banking',
'credit',
'debit',
'loan',
'mortgage',
'insurance',
'crypto',
'bitcoin',
'ethereum',
'binance',
'coinbase',
'kraken',
'revolut',
'n26',
'klarna',
'wise',
'transferwise',
// Social Media & Dating
'youtube',
'tiktok',
'snapchat',
'pinterest',
'reddit',
'tumblr',
'flickr',
'vimeo',
'twitch',
'medium',
'substack',
'patreon',
'onlyfans',
'tinder',
'bumble',
'hinge',
'badoo',
'lovoo',
'parship',
'elitepartner',
// E-commerce & Marketplaces
'ebay',
'etsy',
'alibaba',
'aliexpress',
'wish',
'shein',
'wayfair',
'booking',
'expedia',
'airbnb',
'uber',
'lyft',
'bolt',
'deliveroo',
'doordash',
'ubereats',
'lieferando',
'wolt',
'gorillas',
'getir',
'flink',
// News & Media
'nytimes',
'bbc',
'cnn',
'reuters',
'bloomberg',
'forbes',
'wsj',
'guardian',
'spiegel',
'bild',
'zeit',
'faz',
'sueddeutsche',
'stern',
'focus',
'welt',
'handelsblatt',
'tagesschau',
'zdf',
'ard',
'rtl',
'sat1',
'prosieben',
// Gaming & Entertainment
'steam',
'epic',
'epicgames',
'ubisoft',
'ea',
'electronicarts',
'activision',
'blizzard',
'riot',
'riotgames',
'valve',
'nintendo',
'playstation',
'sony',
'xbox',
'minecraft',
'fortnite',
'roblox',
'pubg',
'gta',
'cod',
'lol',
'leagueoflegends',
'valorant',
'overwatch',
'warcraft',
// Automotive & Transportation
'uber',
'lyft',
'grab',
'didi',
'bolt',
'freenow',
'mytaxi',
'blablacar',
'flixbus',
'flixmobility',
'db',
'deutschebahn',
'bahn',
'ice',
'sbahn',
'ubahn',
'share-now',
'car2go',
'sixt',
'europcar',
'hertz',
'avis',
'enterprise',
// Food & Beverage Brands
'mcdonalds',
'burgerking',
'kfc',
'subway',
'starbucks',
'dunkin',
'dominos',
'pizzahut',
'papajohns',
'coca-cola',
'cocacola',
'pepsi',
'redbull',
'monster',
'nestle',
'danone',
'unilever',
'kelloggs',
'heinz',
'nutella',
'ferrero',
'haribo',
'ritter-sport',
'rittersport',
'milka',
'lindt',
// Telecom & ISPs
'att',
'verizon',
'tmobile',
't-mobile',
'orange',
'bt',
'sky',
'virgin',
'comcast',
'spectrum',
'cox',
'unitymedia',
'kabel-deutschland',
'kabeldeutschland',
'pyur',
'netcologne',
'mnet',
// Universities & Education
'harvard',
'stanford',
'mit',
'oxford',
'cambridge',
'yale',
'princeton',
'coursera',
'udemy',
'udacity',
'edx',
'khan',
'khanacademy',
'duolingo',
'babbel',
'rosetta',
'rosettastone',
// Healthcare & Pharma
'pfizer',
'moderna',
'johnson',
'jnj',
'novartis',
'roche',
'merck',
'abbott',
'medtronic',
'cvs',
'walgreens',
'doctolib',
'jameda',
'aponeo',
'docmorris',
'shop-apotheke',
'shopapotheke',
// Short/valuable names
'a',
'b',
'c',
'd',
'e',
'f',
'g',
'h',
'i',
'j',
'k',
'l',
'm',
'n',
'o',
'p',
'q',
'r',
's',
't',
'u',
'v',
'w',
'x',
'y',
'z',
'ai',
'ml',
'io',
'app',
'web',
'dev',
'pro',
'premium',
'plus',
'max',
'ultra',
'super',
'mega',
'nano',
'micro',
'mini',
'test',
'demo',
'example',
'sample',
'temp',
'tmp',
'new',
'old',
'beta',
'alpha',
'v1',
'v2',
'v3',
'latest',
'stable',
'main',
'master',
'default',
'null',
'undefined',
'true',
'false',
'yes',
'no',
'on',
'off',
'all',
'none',
'one',
'two',
'three',
'free',
'trial',
'sandbox',
'staging',
'production',
'localhost',
'www',
'ftp',
'sftp',
'ssh',
'http',
'https',
'ssl',
'tls',
'dns',
'mx',
'ns',
'cname',
'txt',
'spf',
'dkim',
'dmarc',
] as const;
/**
* Check if a slug is reserved
*/
export function isSlugReserved(slug: string): boolean {
return RESERVED_SLUGS.includes(slug.toLowerCase() as any);
}
/**
* Validate a slug for workspace creation
* Returns an error message if invalid, null if valid
*/
export function validateWorkspaceSlug(slug: string): string | null {
if (!slug) {
return null; // Empty slug is allowed (auto-generated)
}
// Check format
if (!/^[a-z0-9\-]+$/.test(slug)) {
return 'Workspace URL can only contain lowercase letters, numbers, and hyphens';
}
// Check length
if (slug.length < 2) {
return 'Workspace URL must be at least 2 characters long';
}
if (slug.length > 50) {
return 'Workspace URL cannot be longer than 50 characters';
}
// Check reserved
if (isSlugReserved(slug)) {
return 'This workspace URL is reserved and cannot be used';
}
// Check start/end with hyphen
if (slug.startsWith('-') || slug.endsWith('-')) {
return 'Workspace URL cannot start or end with a hyphen';
}
// Check consecutive hyphens
if (slug.includes('--')) {
return 'Workspace URL cannot contain consecutive hyphens';
}
return null; // Valid
}