Skip to main content

Teams app package

Sideload-ready package for the Humanwork bot (app id 2e84ab21-af80-496d-b236-a89347466329).

Upload humanwork-teams.zip via Teams โ†’ Apps โ†’ Manage your apps โ†’ Upload a custom app.

Where the sources liveโ€‹

manifest.json, color.png and outline.png moved to api/config/teams-app-package/ in #6209. The API builds the package on demand at GET /channels/teams/app-package, so a client gets a zip whose botId matches the app id that deployment actually authenticates with โ€” a stale id installs cleanly and then silently never answers.

The runtime image copies config/ and does not copy docs/, which is the practical reason for the move. Edit the manifest and icons there; this directory keeps the docs, the regeneration recipe, and the last hand-built zip.

Iconsโ€‹

Both are generated from source-hwork-logo.png (the brand mark) by the snippet below โ€” regenerate rather than hand-editing, so the two stay in step.

  • color.png โ€” 192ร—192, full colour, flattened onto the brand cream so Teams never composites it against an unpredictable surface.
  • outline.png โ€” 32ร—32, white silhouette on transparency, built from the circle mark ONLY. Teams tints this glyph per theme, so any colour or background in the file fights the client. The wordmark is deliberately excluded: at 32px it renders as mush.

The thin circle stroke is preserved by thresholding at 256px and then downsampling with LANCZOS โ€” thresholding directly at 32px loses the stroke entirely.

Rebuildingโ€‹

Prefer GET /channels/teams/app-package โ€” it stamps the live app id. Build by hand only when you need a zip without a running API:

cd api/config/teams-app-package
# bump manifest.json "version" first, or Teams treats the upload as a duplicate
zip -r ../../../docs/integrations/teams-app-package/humanwork-teams.zip \
manifest.json color.png outline.png

validDomains carries the production API host. A local run through a tunnel does not need it changed โ€” validDomains gates tabs and auth redirects, not bot messaging.

The two GUIDs are different on purposeโ€‹

FieldValueMeaning
id7de7b596-โ€ฆTeams catalog identity โ€” what the app store keys on
bots[0].botId2e84ab21-โ€ฆBot Framework app id โ€” the Azure Bot resource

Samples usually set both to the same GUID, which is fine until you re-upload: Teams then refuses with "This app has already been submitted in your org. The app's external ID is already being used." A version bump does not clear it โ€” the catalog keys on id.

Only id may be regenerated. Changing botId would point the package at a bot that does not exist. To publish a fresh copy: new GUID for id, leave botId alone.

Cleaner alternative when you have access: remove the existing entry first (Teams โ†’ Apps โ†’ Manage your apps โ†’ Humanwork โ†’ Delete, or Teams admin centre โ†’ Manage apps for an org-catalog submission) and re-upload with the original id.