cpatpa rebrands Mike as PIP and teaches it to think in Australian law

A wholesale makeover for law firm Piper Alderman, with the assistant retuned to local legal conventions.

brandingi18n

Most of this work is firm-specific housekeeping: the tool is renamed end to end from Mike to PIP, Piper Alderman's internal name for it, with the firm's logos, brand colours and favicon wired in so the product looks like it was built in-house. None of that travels - it only matters if you're also a firm putting your own stamp on the codebase.

The part worth a second look is what cpatpa did to the assistant's core instructions. It now writes in Australian English, cites authorities in AGLC4 (the standard Australian legal citation style), uses metric units and day-first dates, is told to say so when it isn't sure rather than guess, and carries an explicit reminder that it isn't giving legal advice. That's a compact template for pinning a general-purpose legal AI to one jurisdiction's conventions.

So what Any firm localising a legal-AI tool to its own jurisdiction can borrow the instruction-tuning approach, even if Piper Alderman's branding is no use to them.

View this fork on GitHub →

Spotted something wrong? Or know the PR text has fresher detail than the writeup above?

Commits in this thread

4 commits from cpatpa/PIP, oldest first. Source extracted verbatim from the harvested git log.

SHA Subject Author Date
74e803c2 Browser-visible branding pass: Mike -> PIP Claude 2026-05-15 ↗ GitHub
commit body
Page title, OG metadata, twitter card, error-page title, support
form copy, models page copy, workflows "system" badge, tabular and
workflow column-prompt placeholders, project people modal docblock,
and the site logo wordmark all swap "Mike" for "PIP".

metadataBase and the site-logo landing href now read
NEXT_PUBLIC_API_BASE_URL instead of hard-coding the upstream
mikeoss.com domain.

Internal type names (MikeProject, MikeChat, etc.), the
mikeApi.ts module and the MikeIcon component intentionally stay -
those are part of a follow-up rename so the diffs stay reviewable.
7d24a909 Rename Mike* identifiers to Pip* Claude 2026-05-15 ↗ GitHub
commit body
Bulk rename of upstream-shaped identifiers so the codebase reads as
PIP end-to-end:

  MikeProject, MikeChat, MikeChatDetailOut, MikeCitationAnnotation,
  MikeDocument, MikeDocumentVersion, MikeEditAnnotation, MikeFolder,
  MikeMessage, MikeWorkflow, MikeIcon, MikeLayout -> Pip*
  mikeApi.ts -> pipApi.ts, mike-icon.tsx -> pip-icon.tsx
  application/mike-doc, application/mike-folder DnD MIME-likes -> pip-*
  mike:close-row-actions event -> pip:close-row-actions

Removes the long-dead `mike` boolean prop on PipIcon and its three
callsites.

Backend defaults: chatTools system prompt is now PIP-branded and AU
English-tuned (AGLC4 citations, metric, DD/MM/YYYY, no fabrication,
not-legal-advice reminder). Org admins can still override via
/admin/org-settings. Tracked-change author and change-id prefix flip
from "Mike" to "PIP" so docx revisions surface the right name.
a6b6c0f3 Clean up residual "Mike" references missed by Phase 11 Claude 2026-05-16 ↗ GitHub
commit body
- Rename package.json + lockfile names (mike -> pip, mike-backend
  -> pip-backend) in both apps.
- Update shared/types.ts header comment.
- Migrate localStorage key mike.selectedModel -> pip.selectedModel
  with a one-time legacy read so existing users keep their model
  selection.
- Replace mikeoss.com placeholder URL on the support page with a
  neutral example.com value.
8276afb9 Admin branding: colour tokens, five logo variants, runtime favicon Claude 2026-05-16 ↗ GitHub
commit body
Adds an admin-managed branding surface so the firm's brand colours
and logos can be set from the UI without touching code.

Schema (migration 0021):
- org_settings.brand_primary_hex   default #A93226 (brand red)
- org_settings.brand_secondary_hex default #36475C (dark navy)
- org_settings.brand_neutral_hex   default #6E6E6E (nav text grey)
- org_settings.logo_*_path columns for five variants:
  full_colour, full_white, mark, dark_mono, favicon

Logos live as plain files under ${DATA_ROOT}/branding (mounted to
/data/branding in the backend container). Filenames are
content-hashed so cache busting is automatic. PNG, SVG, WebP, JPEG
accepted for normal variants; .ico, PNG, or SVG for the favicon.
2 MB cap.

Backend:
- New lib/branding.ts (load, write, read, delete, mime/hex
  validation).
- New /branding (public) endpoint pair: GET /branding returns the
  colour tokens + logo URLs; GET /branding/logo/:filename streams
  bytes. No auth required since logos are non-sensitive and the
  login splash needs them.
- New /admin/branding endpoints: GET, PATCH (colours),
  POST /admin/branding/logo/:variant (multipart upload),
  DELETE /admin/branding/logo/:variant.
- singleFileUpload helper now takes a maxBytes argument so the
  branding route can cap at 2 MB without affecting document upload
  limits.

Frontend:
- New BrandingProvider context loads /branding once on app boot,
  injects CSS variables (--pip-primary, --pip-secondary,
  --pip-neutral), and swaps <link rel="icon"> when a favicon
  variant is uploaded.
- SiteLogo prefers the uploaded full_colour variant, falls back to
  the built-in PipIcon + wordmark.
- AppSidebar header shows the mark variant when uploaded; otherwise
  the wordmark renders in the brand-red colour.
- New /admin/branding page: hex colour pickers, drag/upload zones
  per logo variant with preview and remove buttons.

Infra:
- docker-compose mounts ${DATA_ROOT}/branding to /data/branding,
  sets BRANDING_LOCAL_PATH.
- install.sh provisions the branding dir at uid 10001.
- Caddy template adds /branding /branding/* to @backend_api.

Capture this thread into my fork

Download a single Markdown prompt that tells Claude how to port every commit above into your working tree — adapting paths and structure to match your repo. Run it via claude -p < capture-thread-366.md from inside the repo you want the changes in.

⬇ Download capture-thread-366.md