Repository navigation
Friction Log
Developer-experience friction met while building Wick on Amazon Devices, Ring, Alexa+ and AWS. 45 entries, each written when the problem was hit, each with the same six fields: the tool, the task, the steps, what the docs led us to expect, what happened, and the workaround and a specific suggestion for the platform.
The full text of every entry is in FRICTION.md. The same problems, gathered by tool with what worked well beside them, are in Product Feedback. This page is the index, and a guide to the ones that shaped the design most.
| Entry | What was found | What Wick did |
|---|---|---|
| FL-022 | A Vega app can announce something while another app is in front, but every step of how is undocumented, and two of the documents say it cannot. | Start the app's own service, and post a system toast from it. The door reaches her over anything. |
| FL-035 | Fire TV guidance says no heads-up while another app is in front, and a doorbell is exactly the case it rules out. | The door gets a heads-up; a note never does, and waits quietly in the Notification Center. |
| FL-027 | The Ring Developer Playground delivers no doorbell or motion webhook, so nothing event-driven can be shown on it. | A clearly labelled stand-in doorbell for demo homes. |
| FL-001 | The Alexa+ MCP Toolkit is restricted to select partners, with no application path. | A simulated Alexa+ surface that calls the real MCP server. |
| FL-015, FL-016, FL-017 | Vega's WebView crashes on mount, its player silently refuses cleartext HLS, and an AgentCore Runtime in public network mode gets no outbound UDP. | Ring's live view is bridged from WebRTC to HLS in a container Lambda, served over HTTPS. |
| FL-013, FL-014, FL-029 | The Vega file system never provisions a data root on the virtual device, a service cannot be handed anything, and the card service never launches as a process. | A queue that lives in memory first and writes through to disk only when the disk works, with the app as its one writer. |
| FL-042 | Fire TV's Alexa and Vega's speak different media-session languages for the same words. | A single set of rules for a pause, however it arrives. |
| FL-024 | An MQTT client in a WebSocket cannot authenticate to IoT Core the way MQTT clients are shown to, and the reason is one sentence on one page. | A custom authorizer that takes the device token in the query string. |
| FL-033 | App Runner closes a kept-alive client connection after a few seconds to a minute, and each reconnection is the whole of the "slow" tool call. | Measured and documented; fixing it is tracked in issue 47. |
| FL-043 | Content Personalization takes Watch Activity with a clear log, but where it goes cannot be seen without a catalogue. | Removed the code that fed it, and documented that the integration has no visible effect. |
| FL-046, FL-047 | A Strands TypeScript agent built per request breaks interrupts, sessions and memory; a graph cannot loop back to a node with an outside edge. | Session storage contributed to Amazon's AgentCore SDK, and graphs shaped around the limit. |
| FL-048 | A Bedrock Guardrail on Converse reads the user's question too, and its grounding threshold has to be measured on your own text. | Guardrail applied to the output only, with the threshold measured. |
| Title | |
|---|---|
| FL-001 | Alexa+ MCP Toolkit is restricted to select partners, with no application path |
| FL-002 | "Connect Ring account" in the console reports a link that produces no token |
| FL-003 | Partner-initiated linking leaves the integration dormant until an undocumented-by-placement PATCH |
| FL-004 | Partner-Initiated OAuth 2.0 is documented in full, gated silently, and fails with no error code |
| FL-005 | The "snapshot" endpoint is historical retrieval, and its payload is discoverable only by guessing |
| FL-006 | A missing capability fails as a bare validation error, with nothing naming the capability |
| FL-007 | The Vega SDK ships raw .ts that shadows its own .d.ts, and its strict-types escape hatch is not published |
| FL-008 | Image retrieval fails most first attempts after an event, with an internal error name and no documented settling time |
| FL-009 | SP-5's hardware spike is un-runnable this session, so IoT Core stays unbuilt behind a complete MQTT client |
| FL-010 | FL-003's own documented workaround PATCH is itself rejected, and the console's parallel "Sign in" flow doesn't reach it either |
| FL-011 | First real vega build gets the app packaging correctly; the VVD's own installer then rejects the package with no diagnosable reason |
| FL-012 | A custom Metro resolveRequest silently discarded the Vega SDK's own package-redirection resolver, crashing the app on every single launch |
| FL-013 |
IKeplerFileSystem never provisions a data root for this package on the VVD, so every write silently fails and stalls the pairing screen forever |
| FL-014 | Fixing FL-013's symptom exposed the real one: card.service never launches as a process at all, and there is no locally-discoverable manifest field that makes it |
| FL-015 |
@amazon-devices/webview 4.0.2 segfaults on mount on the Vega Virtual Device — including Amazon's own vegaWebview template |
| FL-016 | Vega's media player silently refuses a cleartext HLS URL: no request, no error, a black rectangle |
| FL-017 | A Bedrock AgentCore Runtime in PUBLIC network mode gets no outbound UDP, so it cannot receive Ring live video |
| FL-018 | A Vega app without com.amazon.mediatransform.service in its manifest can't decode any video, and nothing says so until playback |
| FL-019 | Ring's only simulator has no chime, so a chime integration can't be demonstrated without buying one |
| FL-021 |
useTVEventHandler delivers different key names from the ones HWEvent documents |
| FL-022 | A Vega app can announce something while another app is in front, but every step of how is undocumented, and two of the documents say it cannot |
| FL-023 | The add-on docs name two MCP protocol versions, and only one of them is the one the client is shown sending |
| FL-024 | An MQTT client in a WebSocket cannot authenticate to IoT Core the way MQTT clients are shown to, and the reason is one sentence on one page |
| FL-025 | Fire OS has no emulator, and on the one the FAQ names a television app's remote is silent until something holds focus |
| FL-026 | A Vega service whose start takes longer than eight seconds is killed as "not responding", and nothing in the package says a start has a time limit |
| FL-027 | The Ring Developer Playground delivers no doorbell or motion webhook, so nothing event-driven can be shown on it |
| FL-028 | On Fire OS a short key press reaches JavaScript as a key-up only, and a held key under another name, and neither is said anywhere |
| FL-029 | A Vega app can start its own service, but cannot hand it anything: no launch data, no shared storage, no second message |
| FL-030 | Amazon's own image models on Bedrock are past end of life, and the model list says nothing until you call one |
| FL-031 | Vega Media Controls: once a session is registered the remote's Play/Pause reaches the app twice, the simulator has no way to send a media command, and two ordinary state shapes fail with errors that name neither field |
| FL-032 | Speech to text from a browser through App Runner has to be one buffered POST: App Runner has no WebSockets, says so only in a closed GitHub issue, and documents no request-body limit |
| FL-033 | App Runner's front end closes a kept-alive client connection after a few seconds to a minute, says why nowhere, and each reconnection is the whole of the "slow" tool call |
| FL-035 | Fire TV's notification guidance says "no heads-up while another app is in front" in a blog post, says nothing of foreground services, and a doorbell is exactly the case it rules out |
| FL-036 | The Android TV emulator draws no notification of a third-party app: not as a heads-up, not in its notifications panel |
| FL-038 | Vega answers whether high-contrast text is on, but says nothing an app can use about text size, and the simulator cannot turn either setting, or VoiceView, on |
| FL-040 | The Alexa+ MCP add-on design guide names Card, List and Carousel but gives none of them an anatomy, and its components page is not in its own navigation |
| FL-041 | Ring signs a webhook's body and nothing else, documents no replay window, and does not say whether a retry is stamped afresh |
| FL-042 | Fire TV's Alexa and Vega's speak different media-session languages for the same words, and nothing that runs off a Fire TV can send either |
| FL-043 | Content Personalization takes Watch Activity with a clear log, but where it goes cannot be seen without a catalogue |
| FL-044 | Vega's only documented toast API is a React hook, and the one place a toast is needed has no React tree |
| FL-045 | A Step Functions Wait takes a moment, but a task's timeout only takes seconds from now |
| FL-046 | A Strands agent built per request: interrupts, sessions and memory each assume one long-lived agent |
| FL-047 | A Strands TypeScript Graph cannot loop back to a node that has an edge from outside the loop |
| FL-048 | A Bedrock Guardrail on Converse reads the user's question too, and its grounding threshold has to be measured on your own text |
| FL-049 | Amazon Device Messaging is the documented way to reach a Fire TV app from a server, on Fire OS and on Vega, and Wick does not use it yet |
Wick is MIT licensed. Built for the Build, Ship, Shape Amazon Developer Hackathon. These pages summarise the repository's documents; where they differ, the documents in docs/ win.
Understand
Try
Build on it
Learn from it