AWS Builder Center
Weekend Productivity Challenge: Chur List

Weekend Productivity Challenge: Chur List

Talk to your markdown todos. An Alexa skill powered by Lambda, S3, and Amazon Bedrock — built for the Weekend Productivity Challenge.

Vision & What the App Does

I keep my todos in markdown — todos, kanban boards, ideas, all .md files in S3 or Drive. Great, until I'm elbow-deep in bread dough and can't remember if "email Lionel" made today's list.
So why am I the one reading the file? Why not just ask it?
That's Chur List — an Alexa skill that reads your markdown checklist out loud and answers questions about it. "Alexa, what's still pending?" gets a real, conversational answer, not a robotic recital. Under the hood: a markdown reader, an LLM, and a bit of Kiwi cheek in the name (if you're not local: "chur" is NZ slang for "cheers").
No regex, no fixed schema, no brittle parsing. Just a file, a question, and Amazon Bedrock doing the reading comprehension.

How You Built It

The skill follows a straightforward request-response flow:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
+-------------------+
| User (voice) |
+--------+----------+
|
v
+-------------------+
| Alexa Voice |
| Service (NLU) |
+--------+----------+
| IntentRequest + question slot
v
+-------------------+
| AWS Lambda |
| (Python 3.12) |
+--------+----------+
|
+----+----+
| |
v v
+-------+ +----------+
| S3 | | Bedrock |
| (md) | | (Nova) |
+-------+ +----------+
| |
+----+----+
| spoken answer
v
+-------------------+
| Alexa Response |
| (speech output) |
+-------------------+
The user speaks a question. Alexa extracts the intent and a free-text question slot. Lambda receives the event, reads the markdown file from S3, sends the content plus the user's question to Amazon Bedrock (Amazon Nova Pro), and returns the LLM's answer as spoken text.
Every AWS resource is tagged with project: churlist for cost tracking and cleanup.
The Lambda code is split into two files for testability:
handler.py is a thin adapter using the ASK SDK for Python. It routes Alexa requests (LaunchRequest, IntentRequest, Help, Stop) to the appropriate handler. The main ReadTodosIntentHandler extracts the question slot and delegates to the business logic.
checklist_service.py contains all the logic:
  1. _read_checklist_from_s3() fetches the markdown file using boto3's S3 client. It catches common errors (missing file, access denied) and returns spoken-friendly error messages rather than raising exceptions.
  2. _ask_bedrock() sends the markdown content plus the user's question to Amazon Nova Pro via the Bedrock Runtime API. A system prompt instructs the model to keep answers to 2–4 sentences, conversational, and suitable for being read aloud — no bullet points, no markdown formatting.
  3. get_checklist_answer() ties them together with a top-level try/except so the Lambda never returns an unhandled exception. Alexa always gets a valid spoken response.
The markdown file uses standard GitHub-style syntax with - [ ] for pending items, - [x] for completed items, and ##headers as categories. The LLM uses these headers for grouping when answering questions like "what about the AWS project?"

AWS Services Used / Architecture Overview

All infrastructure is managed by three bash scripts using the AWS CLI — no SAM, CDK, or Terraform:
  • deploy.sh creates the IAM role (scoped to S3 GetObject + Bedrock InvokeModel + CloudWatch Logs), the S3 bucket, packages the Lambda with dependencies via uv pip install --target, deploys the function, and adds the Alexa trigger permission. It's idempotent — running it twice updates the code without duplicating resources.
  • run.sh invokes the Lambda with a simulated Alexa event for rapid testing without the Alexa console. Pass --question "what's urgent today?" to test different queries.
  • stop.sh tears down everything in the correct order (Lambda → IAM policy → IAM role → S3 objects → S3 bucket) with a confirmation prompt for safety.
The Alexa skill itself is configured manually via the Alexa Developer Console: paste the interaction model JSON, set the Lambda ARN as the endpoint, and enable testing in Development mode.
AWS services used: Lambda, S3, Amazon Bedrock, Alexa Skills Kit, IAM.

What You Learned

LLMs make checklist parsing trivial. Instead of writing regex to extract pending items, count categories, or filter by keyword, the model handles all of that from natural language. The prompt engineering is minimal — just "keep it short and spoken-friendly."
Decoupling handler from business logic pays off immediately. Testing the Lambda via run.sh (bypassing Alexa NLU entirely) caught issues in seconds that would have taken minutes through the simulator.
IAM eventual consistency is real. Creating a role and immediately using it for a Lambda fails silently. A 10-second sleep is crude but reliable for a weekend build.
Amazon Nova Pro works well for this use case. Short, factual summarization from structured input — the model doesn't hallucinate when the source material is right there in the prompt. I picked Nova Pro over other models mainly for speed and cost — Alexa's response window is tight (around 8 seconds), so a fast, cheap model that doesn't hallucinate on short structured input was the right tradeoff over a larger, slower one.
Tagging everything from day one made it trivial to verify what was deployed and estimate costs. The project: churlist tag on every resource means stop.sh can confidently delete everything without worrying about collateral damage.

Link to the Repo

The complete source code is available on GitHub: https://github.com/robertoallende/churlist 
Deploy it with ./deploy.sh, point it at your own markdown file, and start asking questions.

Conclusion

Chur List demonstrates a reusable pattern: any structured text file in S3 can become voice-queryable through Lambda + Bedrock + Alexa. The same architecture could power voice access to meeting notes, project boards, shopping lists, or any markdown-based workflow.
Chur List started as a weekend experiment, but it points at something bigger: markdown is already the format most of us use for quick thinking, and voice is the fastest way to check in on it without breaking flow. If you keep your todos, notes, or boards in markdown, the pattern's yours to steal — fork the repo, point it at your own file, and start asking.
Any opinions in this article are those of the individual author and may not reflect the opinions of AWS.
Enjoyed reading this content? Let the author know!

Your likes, comments, shares, and saves help creators reach more builders.

Loading recommendations

Loading article