Technical House
Labs

Advanced tools you will reuse

Interactive labs for prompt craft, launch QA, and copy-ready snippets. Everything runs in your browser.

Prompt Lab

Build role · task · context · constraints · format. Instant scoring. Full walkthrough on Prompt Engineering.

Prompt Duel

A/B two prompts with the same rubric. Keep the higher-scoring structure.

Paste two prompts. Same rubric. Promote the winner into your workflow.

Prompt A

10
  • Role: 7
  • Task: 11
  • Context: 14
  • Constraints: 7
  • Output format: 11

Prompt B

10
  • Role: 7
  • Task: 11
  • Context: 14
  • Constraints: 7
  • Output format: 11

Enter prompts to compare.

Ship Checklist

Pre-launch QA for content sites and apps — a11y, SEO, performance, security.

Launch readiness

0%

0 / 24 checks

Content & UX

Accessibility

Performance

SEO & trust

Security & quality

Snippet Library

Copy-ready TypeScript, React, CSS, SEO, and prompt snippets.

JavaScript

Fetch with AbortController

Cancel in-flight requests when the user navigates or types again.

const controller = new AbortController();

async function load(signal: AbortSignal) {
  const res = await fetch('/api/blogs?limit=12', { signal });
  if (!res.ok) throw new Error('Failed to load');
  return res.json();
}

// later: controller.abort()

Next.js

Next.js server fetch with revalidate

Cache public data for a minute; fail soft in the UI.

export async function getPosts() {
  try {
    const res = await fetch(`${process.env.API_URL}/blogs?limit=12`, {
      next: { revalidate: 60 },
    });
    if (!res.ok) return { items: [] };
    return res.json();
  } catch {
    return { items: [] };
  }
}

React

Debounced search value

Trim request spam on typeahead inputs.

import { useEffect, useState } from 'react';

export function useDebounced<T>(value: T, ms = 300) {
  const [v, setV] = useState(value);
  useEffect(() => {
    const t = setTimeout(() => setV(value), ms);
    return () => clearTimeout(t);
  }, [value, ms]);
  return v;
}

CSS

Accessible focus ring (Tailwind)

Visible keyboard focus without permanent thick borders.

.focusable {
  outline: none;
}
.focusable:focus-visible {
  box-shadow: 0 0 0 2px #0a0a0a, 0 0 0 4px #34d399;
}

Prompts

Code review system prompt

Paste before your diff for severity-ranked findings.

You are a staff frontend engineer doing a PR review.

Task: Review the TypeScript React diff for bugs, a11y, and maintainability.

Constraints:
- Rank findings: blocker / major / nit
- Suggest patches, do not rewrite everything
- Flag XSS, unsafe HTML, and missing error/empty states

Output format:
1) Summary (3 bullets)
2) Findings table: severity | issue | fix
3) What looks good

Prompts

React debug system prompt

For infinite loops and effect dependency chaos.

You are a senior React engineer.

Task: Diagnose the bug and propose a minimal fix.

Constraints:
- Do not rewrite the whole file
- Prefer stable references over removing effects blindly
- Call out if the root cause is in the parent

Output format:
1) Root cause
2) Minimal code fix
3) How to verify

TypeScript

Validate env with Zod

Fail fast on missing public API URLs.

import { z } from 'zod';

const envSchema = z.object({
  NEXT_PUBLIC_API_URL: z.string().url(),
  NEXT_PUBLIC_SITE_URL: z.string().url(),
});

export const env = envSchema.parse({
  NEXT_PUBLIC_API_URL: process.env.NEXT_PUBLIC_API_URL,
  NEXT_PUBLIC_SITE_URL: process.env.NEXT_PUBLIC_SITE_URL,
});

SEO

Article JSON-LD sketch

Structured data for long-form guides.

export function articleJsonLd(input: {
  title: string;
  description: string;
  url: string;
  datePublished: string;
  dateModified?: string;
}) {
  return {
    '@context': 'https://schema.org',
    '@type': 'Article',
    headline: input.title,
    description: input.description,
    datePublished: input.datePublished,
    dateModified: input.dateModified || input.datePublished,
    mainEntityOfPage: input.url,
  };
}

Never miss a drop

Get new guides on web development and AI, Prompt Lab tips, videos, downloads and exclusive deals — straight to your inbox. No spam, unsubscribe anytime.