list_case_studies
List Digitaltableteur portfolio case studies with slug, title, category, tags and URLs.
featuredOnly
com.digitaltableteur由 digitaltableteur.com 發布官方發布者v2.0.0更新於 Nov 2, 2026
Design system contracts, docs search, and usage validation for @digitaltableteur components.
遠端 MCP 端點,提供 Digitaltableteur 設計系統:元件文件檢索、用法驗證,以及顧問與作品集資訊。
Web executable,透過 Streamable HTTP。 遠端服務在工作區中設定後即可從網頁執行環境執行。
把這段提示詞貼上到 Claude Code、Codex、Cursor 等代理程式,或 SourceWeft 對話中。代理程式會讀取該伺服器的安裝指南,先向你展示發布者、端點和登入方式,經你同意後再把它新增到你的客戶端。金鑰不會寫進任何命令。
閱讀 https://sourceweft.com/mcp/com.digitaltableteur%2Fmcp/install.md,並按其中說明把這個 MCP 伺服器接入我的客戶端。修改任何設定之前,先告訴我它的發布者、端點和登入方式,等我確認。不要把 API 金鑰寫進命令或我會提交的檔案;問我金鑰應從哪裡取得。把它新增到你客戶端的 mcpServers 設定中。
{
"mcpServers": {
"digitaltableteur": {
"type": "http",
"url": "https://www.digitaltableteur.com/mcp"
}
}
}"Iteration beats perfection—ship today, learn tomorrow, refine forever."
Digitaltableteur is a hybrid monorepo portfolio website featuring both Next.js 16 (production) and Vite (legacy) applications. Built with React 19 and TypeScript 6.x, it showcases a comprehensive design system, multi-language support (EN/FI/SV), AI-powered chat interface, and enterprise-grade tooling including Sentry observability, Linear issue management, and MCP (Model Context Protocol) integrations.
Required for development:
Production only:
See .env.example for complete list with descriptions.
Hybrid Deployment Strategy:
https://digitaltableteur.com)https://nextjs-app.vercel.app)/api/* routes)vercel.json)Vite Build:
Next.js Build:
The project uses a hierarchical CLAUDE.md/AGENTS.md system optimized for AI assistants:
CLAUDE.md (Claude Code Authority)
AGENTS.md (Generic AI Quick Reference)
Claude Code Enhancements
/review, /fix-issue, /create-component, /create-linear-issueClaude Code (automatic):
Generic AI Agents (manual reference):
Documentation:
If you need the raw design data, you can download the Figma file as JSON. Set the
FIGMA_TOKEN environment variable with your personal access token, then run:
Synchronizes design tokens and assets from Figma using the API.
The file is saved as figma.json in the project root.
generate:alt-text streams local image bytes to the OpenAI Vision API so it can describe the actual artwork; add OPENAI_API_KEY (and optionally OPENAI_ALT_MODEL) to .env.local before running, or append --force to regenerate every <img> alt attribute.
Quick Publish Workflow:
docs/SANITY_PUBLISHING_AUTOMATION.md for the complete automated publishing workflowdocs/SANITY_MIGRATION.md for the full migration workflow (React → Sanity via sanity:parse-posts / sanity:convert / sanity:upload, Sanity → MDX via sanity:sync-from-remote, redirects generation, cleanup helpers)Frontend
Styling & Design
src/styles/variables.css@supports queries for modern featuresmargin-inline, padding-block (RTL-ready)State & Data
Backend Services
Developer Tools
AI & Automation
The SocialShare component implements progressive enhancement with the Web Share API:
Native Share Support
Responsive Design
Progressive Enhancement
navigator.share availabilityAccessibility
Browser Support
The implementation follows Web Share API best practices with proper error handling and provides a consistent user experience across all device types.
Test Suite Coverage:
Testing Libraries:
Quality Standards:
Sentry Integration:
MCP Testing:
Storybook:
WIP Badge System:
parameters: { wip: { disabled: true } } after passing:
The site supports three languages with complete translation coverage:
Structure:
nextjs-app/shared/locales/{en,fi,sv}/translation.jsonUsage:
useTranslation() hook"navigation.home" for organizationSecurity Measures:
.env.local (gitignored).gitignore)Performance Optimizations:
Next.js App:
Vite App (legacy):
Hybrid Deployment:
Vercel: Hosts Next.js app + serverless API functions
main branchGitHub Pages: Hosts legacy Vite app + Storybook
npm run deploydigitaltableteur.comDeployment Commands:
Vite Build:
.nojekyll file prevents GitHub Pages Jekyll processingNext.js Build:
Cache-Control headers configured via next.config.tsProduction (Vercel):
Production (GitHub Pages):
GitHub Actions:
Branch Protection:
main branchdocs/LLM_COMPONENT_GENERATION_RULES.md first.stories.tsx for every componentdocs/BRANCH_NAMING.md
Before creating a PR:
npm test)npm run typecheck)npm run lint)npm run build)npm run test:visual:update)npm run build)AI Documentation System:
Critical References:
Setup & Guides:
Frontend:
Styling & Design:
Internationalization:
Testing & Quality:
Backend & Deployment:
Automation & AI:
The Chat interface includes a guided, multi-step email composition workflow triggered by natural phrasing. Two trigger paths exist:
chatEmailSendPhrase and invites composition.chatEmailSimplePhrase, reveals [email protected], then asks if you want to start composing.Both converge to the same reducer-driven flow; only initial phrasing differs. The simple path uses an anchored regex so incidental mentions ("I like email workflows") are ignored.
messageProcessor.ts sets one of two pending flags (pendingEmailWorkflowGeneral or pendingEmailWorkflowSimple) based on multilingual regex matches. ChatWidget consumes exactly one flag on the next assistant turn, injects the phrase key (chatEmailSendPhrase or chatEmailSimplePhrase), mounts workflow UI inline, then resets the flag.
Reducer file: src/components/ChatWidget/emailWorkflow/reducer.ts
Types: src/components/ChatWidget/emailWorkflow/types.ts
States (simplified):
idle – Workflow not activecompose – Initial free-form intent capture (subject / purpose)fields – Sequential structured field collection (name, email, phone (optional), message body)review – User reviews aggregated draft, can edit any fieldsending – Async submission in progress (aria-busy applied)success – Confirmation + summary displayederror – Error state with retry and edit optionsTransitions are deterministic and validated; editing returns to fields with preserved data. Cancellation cleanly resets to idle.
ComposePrompt – Captures initial intent/subjectFieldPrompt – Renders current required field input with validation hintsReviewSummary – Summarizes all collected fields before sendSendStatus – Displays sending, success, or error feedbackAll components are in src/components/ChatWidget/emailWorkflow/ and follow the standard pattern with .stories.tsx and .test.tsx coverage. Styling leverages existing design tokens and CSS Modules; accessible labels and descriptions use i18n keys.
contactValidation.ts – Shared field validators (name, email format, message length, optional phone)contactEmailService.ts – EmailJS send wrapper that throws typed errors (EmailServiceError) enabling granular retry messagingAdd the following to your development .env (prefixed for Vite):
These are used by the workflow and by the traditional contact form. Missing variables gracefully prevent send actions (error state surfaced to user).
All user-visible workflow text uses the emailWorkflow.* key prefix (e.g. emailWorkflow.compose.heading, emailWorkflow.fields.name.label, emailWorkflow.status.success.title). Ensure additions update all three locale files (en, fi, sv) before merging—translation coverage tests will fail otherwise.
htmlForrole="status" + aria-busy="true" with localized progress textemailWorkflow.integration.test.tsx) and simple keyword path (emailWorkflow.simpleTrigger.test.tsx)emailWorkflow.* keys present across localesTo extend with additional fields or optional attachments:
EmailDraft type and validatorsemailWorkflow.fields.<fieldName>.*ReviewSummary rendering & testsPrefer additive changes over altering existing field semantics to avoid breaking previously localized content.
Any architectural or trigger behavior changes MUST update this README, .github/copilot-instructions.md, CLAUDE.md, and docs/donny-chat.md together.
Automated scripts produce lightweight JSON artifacts consumed by UI components (e.g., summary cards) and Storybook dashboards without live API calls at render time:
public/observability/sentry-summary.json (generated via scripts/generate-sentry-summary.mjs or scripts/sentry-mcp.js commands)public/observability/ts-mcp-status.json (generated via scripts/ts-mcp-automation.mjs)The Sentry summary script runs with project + filter options (unresolved production issues). A stub mode is available when credentials are absent; UI distinguishes stub data via a badge.
SentrySummaryCard reads and renders Sentry JSON with localized loading/error/empty statesobservability.sentry.*, future observability.ts.*) synchronized across localesWhenever observability schemas evolve (new fields, renamed properties) update README, .github/copilot-instructions.md, and CLAUDE.md concurrently. Tests must be added or adjusted to cover new states (e.g., stub detection, additional metadata rendering).
Donny’s serverless chat handler automatically loads every MCP server declared in mcp.json. In addition to the local TypeScript language server and Sentry helper, the repository now includes the hosted Context7 MCP server so assistant prompts can pull the latest framework/library docs without leaving the conversation.
mcp.json → "context7" entry points at https://mcp.context7.com/mcp and sends the Context7-API-Key header (value resolved from CONTEXT7_API_KEY). Leave the env unset for anonymous/low-rate usage.npm run context7:mcp -- [optional flags]
--remote-check to ping the hosted Context7 MCP endpoint. The helper automatically injects the Context7-API-Key header using CONTEXT7_API_KEY.CONTEXT7_API_KEY in .env.local or your shell profile (the secret lives in Vercel’s project envs) to benefit from higher rate limits and private library access. The script automatically injects the key unless you pass --api-key manually.https://context7.com/api/v1; use that base URL whenever you need to inspect account status or manage keys outside the dashboard.api/donny-tools.ts names each tool as <server>.<toolName>, so Context7 capabilities appear under the context7.* namespace when connected. This keeps downstream prompts explicit and makes it easy to disable the server by removing the config block if needed.
The official GitHub MCP Server provides AI tools with direct access to GitHub's platform capabilities.
mcp.json → "github" entry points at https://api.githubcopilot.com/mcp/ and sends the Authorization: Bearer header (value resolved from GITHUB_MCP_PAT)GITHUB_MCP_PAT environment variablenpm run github:mcp:testCapabilities include:
GitHub capabilities appear under the github.* namespace when connected, maintaining the same explicit tool naming pattern.
The figma-developer-mcp provides AI tools with direct access to Figma's design platform for design-to-code workflows.
mcp.json → "figma-developer-mcp" entry runs as SSE server at http://localhost:3333/sseFIGMA_TOKEN environment variablenpx figma-developer-mcp before using MCP featuresnpm run figma:mcp:testCapabilities include:
Figma capabilities appear under the figma.* namespace when connected, enabling AI assistants to interact with your design files and generate implementation code directly from Figma designs.
來源:README.md,提交 1a823a2
List Digitaltableteur portfolio case studies with slug, title, category, tags and URLs.
featuredOnlyGet one case study by URL slug (e.g. dsharp-design-system, helsinki-design-system).
slug必填List fixed consulting packages with EUR price ranges and duration (preferred over hourly for defined outcomes).
無需輸入參數。
Get typical and range hourly consulting rates in EUR (€90/h typical, €90–150/h depending on scope).
無需輸入參數。
List core consulting services (design system audit, component library, tokens, AI DesignOps).
無需輸入參數。
List technology and practice areas (React, Next.js, Storybook, Figma, TypeScript, etc.).
無需輸入參數。
List client audiences Digitaltableteur serves (startups, scaleups, enterprise, etc.).
無需輸入參數。
Get Digitaltableteur office hours in Europe/Helsinki timezone.
無需輸入參數。
Map a visitor problem statement to the best-matching consulting service.
problem必填Search design-system docs
Search the @dt design-system docs registry by name, keyword or UI intent. Returns budgeted briefs (import line, key props, related components) with a hint for the follow-up get call.
limitquery必填Get component docs
Get the full docs-registry entry for one component: usage guidance, props, example story source and theming tokens.
name必填sectionValidate component usage
Check proposed @dt JSX against the component contracts: prop relationships, forbidden prop combinations, deprecated props and raw-UI replacements. Pass a TSX snippet or a component name with props.
propssnippetcomponent已滿足適用檢查項的 90%
該評分衡量此收錄條目的完整程度,依據註冊中心條目、端點與公開來源計算得出。它不是對伺服器本身的評價,也不表示伺服器安全或目前可用:可連通性是帶日期的檢查結果,評分也不包含安裝量或使用者評價。
請在儲存庫或註冊中心條目中宣告授權條款。
_____ _______| __ \ |__ __|| | | | | || | | | | || |__| | | ||_____/ |_|# Clone repositorygit clone https://github.com/PetriLahdelma/digitaltableteur.gitcd digitaltableteur
# Install dependenciesnpm install
# Copy environment templatecp .env.example .env.local# AnalyticsVITE_GA_ID=G-XXXXXXXXXX # Google Analytics 4
# Email ServicesVITE_EMAILJS_SERVICE_ID=service_xxxVITE_EMAILJS_TEMPLATE_ID=template_xxxVITE_EMAILJS_PUBLIC_KEY=xxx
# MCP Servers (optional for enhanced AI features)FIGMA_TOKEN=figd_xxx # Figma design accessGITHUB_MCP_PAT=github_pat_xxx # GitHub operationsCONTEXT7_API_KEY=xxx # Context7 documentation access
# Linear Issue Management (optional)LINEAR_API_KEY=lin_api_xxxLINEAR_TEAM_ID=xxxLINEAR_PROJECT_ID=xxx
# Akaunting Accounting (optional, self-hosted)[email protected]AKAUNTING_API_PASSWORD=xxxAKAUNTING_COMPANY_ID=1CV_PASSWORD=xxx # Secure resume downloadOPENAI_API_KEY=sk-xxx # AI chat functionalitySENTRY_DSN=https://[email protected]/xxxSENTRY_AUTH_TOKEN=xxx # Source map upload# Next.js dev server (production app)npm run dev # http://localhost:3001
# Storybook component developmentnpm run storybook # http://localhost:6010# Type checkingnpm run typecheck # TypeScript validation across project
# Lintingnpm run lint # ESLint + Stylelintnpm run lint:fix # Auto-fix linting issues
# Testingnpm test # Run all tests (Vitest)npm run test:watch # Watch modenpm run test:coverage # Coverage report (>80% target)npm run test:a11y # Accessibility tests (axe-core)npm run test:visual # Visual regression (Playwright + Storybook)
# Pre-commit validation (run before PR)npm run typecheck && npm run lint && npm test && npm run build# GitHub MCP Servernpm run github:mcp:test # Test connectivity and authentication
# Figma MCP Servernpm run figma:mcp:test # Test connectivity and authentication
# Context7 MCP Servernpm run context7:mcp # Launch locally (respects CONTEXT7_API_KEY)npm run context7:mcp -- --remote-check # Test remote endpoint
# TypeScript LSP Statusnpm run ts:mcp:status # Validate TypeScript language servernpm run ts:mcp:status:stub # Generate stub status
# Linear Issue Managementnpx tsx scripts/linear/create-issue.ts # Interactive issue creationnpx tsx scripts/linear/update-issue.ts --issue DIG-16 --state "Done"npx tsx scripts/linear/check-issue.ts DIG-16 # Display issue details
# Sentry Observabilitynode scripts/sentry-mcp.js issues digitaltableteur 10 --unresolvednpm run generate-sentry-summary # Generate dashboard data# Next.js production buildnpm run build # Output: .next/
# Storybook static buildnpm run build-storybook # Output: storybook-static/# Vite to GitHub Pagesnpm run deploy # Build + gh-pages deployment
# Vite + Storybook visual diffsnpm run deploy-with-storybook # Deploy with visual regression report
# Manual cache bustingnpm run cache-bust # Add version metadata + .nojekyll
# Vercel (production - automatic on push to main)vercel --prodRoot Documentation (Universal Rules)├── CLAUDE.md (380 lines) # Comprehensive authority for Claude Code├── AGENTS.md (150 lines) # Quick reference for generic agents└── .github/copilot-instructions.md # GitHub Copilot specific
Subdirectory Documentation (Specific Context)├── app/CLAUDE.md + AGENTS.md # Next.js App Router patterns├── shared/components/CLAUDE.md + AGENTS.md # Component library rules├── docs/AGENTS.md # Documentation navigation└── scripts/AGENTS.md # Automation patterns
Claude Code Configuration├── .claude/settings.json # Hooks (auto-format, safety checks)└── .claude/commands/ # Custom slash commands ├── review.md # Comprehensive code review ├── fix-issue.md # GitHub issue workflow ├── create-component.md # Component generation └── create-linear-issue.md # Issue creation/review # Comprehensive code review/fix-issue 123 # Analyze and fix GitHub issue/create-component Button # Generate component (5 files)/create-linear-issue Implement X # Create Linear issuecat AGENTS.md # Root rulescat app/AGENTS.md # Next.js patternscat shared/components/AGENTS.md # Component rulesnpm run fetch-figmanpm run generate:sitemap # Generate XML sitemapnpm run generate:llms # Create LLM-friendly content indexnpm run generate:alt-text # Generate accessibility descriptions (requires OPENAI_API_KEY)# Publish single article from Sanitynpm run sanity:publish-single <article-slug>
# Publish all articlesnpm run sanity:publishdigitaltableteur/├── app/ # Next.js 16 App Router (production)│ ├── layout.tsx # Root layout with providers│ ├── page.tsx # Home page (server component)│ ├── about/page.tsx # Route pages│ ├── blog/[slug]/page.tsx # Dynamic routes│ └── api/*/route.ts # API routes (Vercel functions)│├── src/ # Vite app (legacy, being phased out)│ ├── App.tsx # React Router configuration│ ├── pages/ # Route components (to be migrated)│ └── components/ # Component library│├── shared/ # Symlinked shared code│ ├── components/ # Design system (from src/components)│ ├── hooks/ # Custom React hooks│ ├── styles/ # Design tokens & global styles│ └── locales/ # i18n translation files││├── scripts/ # Automation & tooling│ ├── linear/ # Issue management│ ├── sentry-mcp.js # Observability queries│ └── generate-*.js # Code generation│├── docs/ # Documentation│ ├── LLM_COMPONENT_GENERATION_RULES.md (12,000+ words)│ ├── NEXTJS_MIGRATION_PLAN.md│ ├── LINEAR_AUTOMATION.md│ └── *_MCP_SETUP.md # MCP integration guides│└── .claude/ # Claude Code configuration ├── settings.json # Hooks (auto-format, safety) └── commands/ # Custom slash commandsnpm test # Run all testsnpm run test:watch # Watch modenpm run test:coverage # Generate coverage reportsnpm run test:a11y # Accessibility testingnpm run test:visual # Visual regression testsnpm run test:visual:update # Update visual baselinesnpm run lint # ESLint + Stylelintnpm run lint:fix # Auto-fix linting issuesnpm run format # Prettier formattingnpm run typecheck # TypeScript validationnpm run sentry:issues # Query unresolved issuesnpm run sentry:releases # List recent releasesnpm run generate:sentry-summary # Generate JSON summarynpm run github:mcp:test # Test GitHub MCP connectivitynpm run figma:mcp:test # Test Figma MCP connectivitynpm run ts:mcp:status # Validate TypeScript LSPnpm run storybook # Launch Storybook dev servernpm run build-storybook # Build static Storybooknpm run storybook:deploy # Deploy to GitHub Pagesnpm run build # Build Next.js app (production)npm run start # Start Next.js production servernpm run build # Vite production buildnpm run preview # Preview Vite production buildnpm run cache-bust # Manual cache bustingnpm run deploy # Deploy Vite app to GitHub Pagesnpm run deploy-with-storybook # Deploy with visual diff reportnpm run storybook:deploy # Deploy Storybook standalonenpm run generate:sitemap # Generate sitemap.xmlgit checkout -b DT-XXX-feat-descriptionnpm run typecheck && npm run lint && npm test && npm run buildgit commit -m "feat: add amazing feature"git push origin DT-XXX-feat-descriptionVITE_EMAILJS_SERVICE_ID=<your_service_id>VITE_EMAILJS_TEMPLATE_ID=<your_template_id>VITE_EMAILJS_PUBLIC_KEY=<***REMOVED***>npm run ts:mcp:status # Perform LSP handshake and write status JSONnpm run ts:mcp:status:stub # Force stub status JSON (no handshake)