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โ
| Field | Value | Meaning |
|---|---|---|
id | 7de7b596-โฆ | Teams catalog identity โ what the app store keys on |
bots[0].botId | 2e84ab21-โฆ | 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.