← Financial Cloud CloudCloud Club · 挑戰

極點宏觀|Financial Cloud Cloud · 挑戰

Weekend Creative Challenge: Leadership Card Game

Series: Challenge

Challenge: 05

Tag: #creative-expression

文章
Kiro 工作坊
01 使用 Kiro 建置:他加祿語學習 App 的提示優先產品設計工作坊
Kiro 工作坊
02 使用 Kiro 建置:他加祿語 學習 App 的教育優先開發技巧工作坊
Kiro 工作坊
03 使用 Kiro 建置:他加祿語 學習 App 的深入開發流程工作坊
Kiro 工作坊
04 使用 Kiro 建置:將 他加祿語 學習 App 在地化為中文變體工作坊
Kiro 工作坊
05 使用 Kiro 建置:他加祿語 卡片的文法與發音補強管線工作坊
Kiro 工作坊
06 使用 Kiro 建置:他加祿語 學習 App 中可審查的獨特額外例句工作坊
Kiro 工作坊
07 與 Kiro 同行:晶圓廠工程健康度 Hook 工作坊
Kiro 工作坊
08 與 Kiro 同行:蝕刻製程視窗風險測試自動化工作坊
Kiro 工作坊
09 與 Kiro 同行:黃光微影漂移風險開發工作坊
Kiro 工作坊
10 工程團隊入門 — 日常工廠值班使用 fab spc drift sync portal
Kiro 工作坊
11 工程團隊附錄 — fab spc drift sync portal 的日常工廠值班使用
Kiro 工作坊
12 Kiro:規格驅動工廠軟體的現場工程工作坊
Kiro 工作坊
13 Kiro:實作 Lab — 從零建置具型別的 Factory Risk Portal
Kiro 工作坊
14 Kiro:工程開發人員的提示、程式碼和型別標準手冊
Kiro 工作坊
15 Kiro:為什麼強 React 提示可以防止型別宣告錯誤啟動
Kiro 工作坊
17 與 Kiro 一起建構:建立工廠自動化入口網站 React UI
Kiro 工作坊
18 與 Kiro 一同建構:打造工廠自動化入口網站背後的自動化分析引擎
Kiro 工作坊
19 與 Kiro 一起實作:將 AI 工廠自動化輔助程式新增至工廠自動化入口網站
Kiro 工作坊
21 Kiro:2 小時專業開發人員工作坊指南
Kiro 工作坊
22 Kiro:從零建置 Fab SPC Drift Synchronization Portal
Kiro 工作坊
23 Kiro:提示詞庫與深度程式碼說明附錄
Kiro 工作坊
30 與 Kiro 一同建構:建立工廠自動化入口網站 UI
Kiro 工作坊
31 與 Kiro 一同建構:打造工廠自動化入口網站背後的自動化分析引擎
Kiro 工作坊
32 與 Kiro 一起實作:為工廠自動化入口網站增添 AI 工廠自動化助理
Kiro 工作坊
33 與 Kiro 一起開發:重建 CME Direct 風格的量化損益排行榜 UI
Kiro 工作坊
34 與 Kiro 一起開發:重建損益排行榜背後的量化分析引擎
Kiro 工作坊
35 與 Kiro 一起建構:適用於量化排行榜的 AWS AI 驅動交易台助理
Kiro 工作坊
36 單頁交易平台 SOP
Kiro 工作坊
AgentCore
A1 使用 AgentCore 與 Strands 建構:Gateway MCP 工具織網開發者工作坊
AgentCore
A2 使用 AgentCore 與 Strands 建構:受治理的多 Agent 風險系統開發者工作坊
AgentCore
A3 使用 AgentCore 與 Strands 建構:執行期主權風險代理人開發者工作坊
AgentCore
模擬考場
E1 用 Vibe Coding 打造多語言 AWS 證照模擬試題上線系統
模擬考場
E2 利用 Vibe Coding 開發技巧打造 AWS 證照模擬練習室
模擬考場
E3 打造靜態 AWS 模擬考場背後的練習引擎
模擬考場
Amazon Q
Q1 Amazon Q:ACM 憑證自動更新的CloudShell優先開發人員工作坊
Amazon Q
Tagalog 練習室
T1 為 AWS Manila Community Day 打造 Tagalog 學習 App:提示詞優先的產品設計
Tagalog 練習室
T2 為 AWS Manila Community Day 打造 Tagalog 學習 App,採用教育優先的開發提示
Tagalog 練習室
T3 為 AWS Manila Community Day 打造 Tagalog 學習 App 的開發流程深度解析
Tagalog 練習室
T4 將 Tagalog 學習 App 在 AWS Manila Community Day 情境中在地化為中文版本
Tagalog 練習室
T5 為 AWS Manila Community Day 打造 Tagalog 卡片打造文法與發音補強流程
Tagalog 練習室
T6 為 AWS Manila Community Day 打造 Tagalog 學習 App 的 Extra Examples 更獨特且可審閱
Tagalog 練習室
路線圖
R1 企業級 Data Analytics Roadmap 一百個深度情境題
路線圖
R2 前端開發路線圖:真實企業場景
路線圖
香港 Community Day
C1 伴隨 AWS Community Day 的香港週末:從雲端技術論壇到維港璀璨夜景
香港 Community Day
C2 講者的奢華週末:分享您的 AWS 故事,讓香港成為您的專屬舞台
香港 Community Day
C3 香港七十二小時:AWS Community Day 講者的極致之旅
香港 Community Day
馬尼拉 Community Day
C4 AWS Community Day Manila:一場連結雲端技術、城市文化與真摯友誼的快樂週末
馬尼拉 Community Day
C5 AWS Community Day Manila:雲端建立者在菲律賓感受最幸福的精神
馬尼拉 Community Day
C6 AWS Community Day Manila:在快樂之城建構、打破、重來,並找到歸屬
馬尼拉 Community Day
C7 菲律賓馬尼拉初次造訪建議
馬尼拉 Community Day
菲律賓 × 香港
C8 菲律賓香港資本市場升級
菲律賓 × 香港
回測
B1 使用 Bedrock AgentCore 與 Strands Agents 建立機構級 Amazon 純做多 (Long-Only) 回測代理
純做多 AMZN 代理:AgentCore、Strands 與可稽核的 Backtrader 帳本。
B2 使用 Backtrader、AgentCore 與 Strands Agents 建立具市況感知能力的 Amazon 部位管理
把市況當成部位控制,而不是圖表註解。
B3 使用 Nasdaq、S&P 500、Dow、AgentCore 與 Strands 建立相對於基準的 Amazon 進出場時機系統
相對 Nasdaq、S&P 500 與道瓊來判斷 AMZN 時機。
B4 使用 Bedrock AgentCore、Strands Agents 與 Backtrader 建立受治理的 Amazon 交易歷史工廠(Trade-History Factory)
把回測做成可稽核的交易歷史工廠。
B5 使用 Bedrock AgentCore 與 Strands Agents 建立智慧代理型 (Agentic) Amazon 回測營運模型 [Part 1]
先建立營運模型,再爭論結果。
B6 為 Amazon 擇時與部位管理建立客製化 Cerebro 程式碼說明 [第 2 部分]
先講 Cerebro 引擎,再講圖表。
B7 為 Amazon 策略結果與經驗教訓建立交易員審閱紀錄 [Part 3]
把策略排名寫成交易員審閱紀錄。
B8 使用 AgentCore 與 Strands 建立受治理的 FSI Amazon 部位管理 Playbook [Part 4]
受治理的 FSI Amazon 部位管理手冊。
B9 使用 Amazon Bedrock AgentCore 建立主權風險交易代理,分析殖利率差、FX 避險與債務重新定價
主權風險代理:殖利率差、外匯避險與債務重定價。
B11 建置現代波動率交易與合法泰國復原規劃代理程式:記憶體驅動的 Strands 多代理程式風險防護系統
記憶驅動的 Strands 代理:波動率與泰國復原規劃。
B12 使用 Amazon Bedrock AgentCore Memory 建構空頭跨式部位交易風險治理
空頭跨式部位的交易風險治理。
B13 在 Amazon EKS 上建構生產環境就緒的信用與收益質押 AI 智能體
在 EKS 上跑生產級信用與收益質押代理。
挑戰
01 週末生產力挑戰:Fab SPC 漂移同步入口網站
Fab SPC 漂移審查與建議入口網站。
02 週末生產力挑戰:Quant P&L Commander — AWS 上由 AI 驅動的交易生產力入口網站
AWS 上由 AI 驅動的交易生產力入口網站。
03 週末煩人的任務挑戰:交易台在雲端、鏈上、空中執行摘要
DeskPulse 日常交易執行摘要。
04 週末 Agent 挑戰:上午 6 點交易風險審查
無人值守、以證據為基礎的晨間交易風險簡報。
05 Weekend Creative Challenge: Leadership Card Game
瀏覽器版創意引導卡牌。
06 Full Stack Challenge: Community Day Board App
瀏覽器版活動溝通空間。
領導力卡牌
01 Leadership Card Game: 雲端還沒自動化的最後一項本事:像領導者一樣說話
寫給 建構者的現場隨筆——談語言、勇氣,以及 Leadership Card Game
02 領導力回合的解剖:Leadership Card Game 實際怎麼玩
給 建構者的引導員實地指南——讓演練嵌進真實會議
03 Leadership Card Game: 當機會不再屬於主辦者
寫給 建構者的現場隨筆:權力轉移、多語領導力練習夜,以及走完入口、資源、敘事的職涯弧線
04 週末創意挑戰:Leadership Card Game
一篇建構者手記:願景、架構,以及週末創意挑戰教會我的事
05 從週末挑戰專案到 $1,386 群眾募資:改變你在職場現身方式的領導力練習
一個週末做出的作品,變成 600 張卡的線上領導力練習室,並募到 $1,386。
06 從週末挑戰專案到 $1,386 群眾募資:進入科技產業的第一天路徑
一個週末挑戰如何變成具備 600 張卡、由 AWS 驅動的多語產品,並募到 $1,386?
07 從週末挑戰專案到 $1,386 群眾募資:用轉移機會建立專業品牌
一個週末挑戰把領導想法做成能跑的多語產品,並募到 $1,386。
08 Leadership Card Game — 群眾募資活動
募資目標: HKD 5,000 已募金額: HKD 1,386 距目標還差: HKD 3,614 進度: 28% 創作者: D.C. Dan · L.L. Diana · L.K. Lva 所在地: 日本、香港、新加坡 投資人權益: 即期價值、私密會員卡牌編輯器雲(Private Membership Card…
09 PR/FAQ 01 — Leadership Card Game 面向社群建構者正式推出
「逆向工作法」文件 · 對外新聞稿 + FAQ 產品: Leadership Card Game 受眾: 社群經理、志願組織者、職涯早期建構者
10 PR/FAQ 02 — 企業引導員採用 Leadership Card Game 進行現場領導力演練
「逆向工作法」文件 · 對外新聞稿 + FAQ 產品: Leadership Card Game 受眾: 學習與發展負責人、人員管理者、敏捷教練、企業引導員
10 PR/FAQ 03 — 多語 Leadership Card Game 為建構者擁有權開放全球練習室
「逆向工作法」文件 · 對外新聞稿 + FAQ 產品: Leadership Card Game 受眾: 全球 建構者、雙語社群、跨境產品團隊、開源導師
AWS Builder Center
01 AWS Builder Center、社群精神與 AWS Builder Jacket
霓虹訊號、共享創意,以及為建構者打造的外套。
02 走進 AWS Builder Center:一座能學習、貢獻,也讓人有歸屬感的全球技術平台
一段精彩旅程,不一定從機場開始。
03 AWS Community Builder 的巨大成功
當建構者公開分享,整個社群就會一起前進。
04 AWS Builder Center 的巨大成功
一座為好奇心打造、充滿活力的全球街區。
05 週末走進 AWS Builder Center:從社群靈感到令人難忘的 AWS Builder Jacket
星期五晚上,開始於建構者熟悉的感覺:有一個點子,正卡在問題與可能性之間。

Live app: https://vertexmacro.com/cloud_club/demo/leadership_card_game/index.html

Github repo: https://github.com/dchan-dev/Leadership-Card-Game

領導力卡牌遊戲架構:EventBridge、DynamoDB、Lambda 與 S3。
領導力卡牌遊戲架構:EventBridge、DynamoDB、Lambda 與 S3。
AWS Builder 牌組的 Leadership Practice 瀏覽畫面。
AWS Builder 牌組的 Leadership Practice 瀏覽畫面。

Vision and What the App Does

The Leadership Card Game is a browser-based creative facilitation tool that turns difficult workplace conversations into a structured card-playing experience. I wanted to build something more expressive than a reference page and more practical than a list of leadership advice. The result is an interactive deck that helps teams, community leaders, builders, and facilitators rehearse what they might actually say when a situation becomes ambiguous, political, tense, or high stakes.

The app contains a collection of 600 leadership practice cards. Each card is a small creative artifact with a number, title, role, leadership principle, skill rating, speaking line, side effect, advantage, and a suggestion for combining it with other cards. Instead of telling a player only to “communicate better,” a card gives the player language that can be spoken, adapted, challenged, and discussed. That makes the output of the app both creative and usable: it produces combinations of prompts, dialogue, role-play, reflection, and collaborative storytelling around realistic leadership situations.

The cards are organized into three broad ranges. Cards 001 through 150 focus on the Community Manager role, cards 151 through 300 focus on the Builder role, and cards 301 through 600 introduce advanced situations. The advanced deck covers challenges such as executive conflict, angry stakeholders, public blame, unsafe dissent, irreversible decisions, trust recovery, and difficult cross-functional work. A one-to-five-star skill indicator helps players understand the relative difficulty of applying each card.

The website supports two complementary ways to use the content. In browse mode, a user can search across titles, speaking lines, principles, advantages, and side effects. Cards can be filtered by role or number range and sorted by number or skill level. A compact view makes the large deck easy to scan, while the full-card option exposes all of the card fields. Selecting a card opens a focused detail view.

In game mode, two to six players can enter their names and choose a basic or advanced deck. Each player receives three randomly selected cards. The active speaker can discuss or act on a card, move to the next speaker, and start a new round with newly dealt cards. This transforms a static dataset into a social activity. A facilitator can use it for a workshop, a team can use it to discuss a current challenge, or an individual can draw cards as writing prompts for reflecting on a decision.

Language accessibility was also part of the vision. The interface is designed to load separate JSON files for English, Traditional Chinese, and Simplified Chinese. Because the interface and creative content are separated, the deck can grow into new languages without rebuilding the application itself.

How to Play: Step by Step

The game is designed to work for individual reflection, a small team conversation, or a facilitator-led workshop. A typical session follows these steps:

  1. Open the app and choose a language. Start the Leadership Card Game in a browser. Use the language selector to choose English, Traditional Chinese, or Simplified Chinese. The interface and card content update to the selected language.
  2. Browse the deck or start a game. Use browse mode when you want to explore specific leadership situations. Select Start Game when you want a structured group activity with randomly dealt cards.
  3. Choose the number of players. A game can include two to six players. Enter each participant's name so the app can display individual hands and clearly identify the current speaker.
  4. Select a difficulty level. Choose the basic deck for cards 001 through 300, which focuses on Community Manager and Builder situations. Choose the advanced deck for cards 301 through 600, which introduces more difficult leadership and conflict scenarios.
  5. Deal three cards to each player. After the game starts, the app shuffles the selected card pool and gives every player three cards. Each hand provides multiple ways to approach the conversation rather than forcing a single answer.
  6. Let the active player choose a card. The current speaker reviews the three available cards and selects the one that best fits a real or imagined workplace challenge. Selecting the card opens its complete details.
  7. Read or adapt the speaking line. The player reads the card's speaking line aloud or adjusts it naturally for the situation. The goal is to practice language that could be used in an actual conversation, not simply to describe a leadership principle in the abstract.
  8. Discuss the action and tradeoff. Review the leadership principle, side effect, and advantage shown on the card. The player explains what action they would take, what benefit they expect, and what cost or risk they must accept. Other players can ask questions, offer evidence, or describe how a stakeholder might respond.
  9. Explore card combinations. Use the card's combination guidance to connect it with another card or leadership approach. This encourages players to develop a more complete strategy and shows that difficult situations rarely have a one-card solution.
  10. Move to the next speaker. Select Next Speaker after the active player has completed the discussion. The app rotates the active role so every participant receives an opportunity to contribute.
  11. End the round and deal new cards. After all players have spoken, select End Round · New Cards. The current hands move to the discard pile, the round counter advances, and each player receives three new cards.
  12. Reflect on what changed. At the end of the session, discuss which speaking lines felt useful, which side effects were hardest to accept, and whether the proposed actions created a repeatable opportunity for others. A facilitator can capture the strongest ideas as follow-up actions for the team.

For a shorter solo experience, a user can stay in browse mode, filter the deck by role or difficulty, open one card, and write a response to its speaking line, advantage, and side effect. This makes the same app useful as both a multiplayer facilitation game and a personal creative reflection tool.

How I Built It

Starting with the smallest useful experience

I began with a focused MVP: load a JSON file, render a grid of cards, and allow a user to open one card for its full details. This was intentionally simple. The challenge encouraged builders to make one creative idea work well instead of over-engineering an entire platform. A static frontend also made it possible to iterate quickly without waiting for a complex deployment pipeline.

I built the interface with semantic HTML, CSS, and vanilla JavaScript. Avoiding a frontend framework was a deliberate decision. The app does not require server-side rendering or a large client dependency graph. A single-page static site keeps the download small, reduces maintenance, and works naturally with Amazon S3 static website hosting.

Once basic rendering worked, I added discovery features. Client-side search builds a searchable text value from the card number, title, role, leadership principle, speaking line, advantage, side effect, and combination guidance. Role and range filters let users narrow the deck without sending requests to a backend. Sorting supports ascending and descending card numbers as well as descending skill ratings. All of these interactions happen locally after the JSON file loads, so they feel immediate.

The next iteration added game mechanics. I created a Fisher-Yates-style shuffle, separated basic and advanced card pools, and implemented draw and discard piles. Each player receives three cards per round. At the end of a round, the current hands move to the discard pile and new hands are dealt. When necessary, discarded cards can be reshuffled back into the draw pile. I kept the game state in the browser because the challenge version does not require accounts, saved sessions, or real-time multiplayer synchronization.

Separating the source of truth from the published artifact

The most important architecture decision was to avoid treating the JSON file in the website bucket as the editing database. The website needs one optimized asset that is easy to fetch, but the content workflow needs individual records that can be updated safely. I therefore use Amazon DynamoDB as the system of record for card information. Each card is stored as a JSON-like DynamoDB item with a stable card identifier and the fields required by the frontend.

A scheduled AWS Lambda function reads the current card records from DynamoDB, validates and orders them, wraps them in the JSON structure expected by the website, and writes the latest generated file to the S3 website bucket. Amazon EventBridge Scheduler invokes that Lambda function on a recurring schedule. This keeps content administration separate from content delivery while still giving the static website a fresh, predictable data file.

This pattern was useful because the browser never needs permission to query DynamoDB directly. It only performs an HTTP request for a static JSON object in the same site. That reduces frontend complexity and prevents database credentials or write operations from being exposed to visitors.

Key decisions

  1. Use S3 for the frontend. The application is made entirely of static assets, so I selected S3 static website hosting rather than running a web server.
  2. Use DynamoDB for editable card records. Individual cards can be created or updated without manually editing one enormous production file.
  3. Publish a generated snapshot. Lambda converts database records into a version suitable for fast browser delivery.
  4. Schedule publication. EventBridge Scheduler makes the refresh repeatable and removes a manual export step.
  5. Keep interaction in the browser. Search, filtering, sorting, shuffling, dealing, language switching, and modal views do not need a request for every action.
  6. Keep localization data-driven. The frontend maps each language to a corresponding card JSON file, which makes additional language versions straightforward.
  7. Design for mobile and accessibility. Responsive layouts, visible labels, keyboard-friendly buttons, dialog semantics, escape-key handling, readable type sizes, and reduced-motion behavior were included from the start.

Challenges and How I Overcame Them

The first challenge was the size and consistency of the deck. Six hundred cards contain many repeated fields, and a malformed record could break rendering or create a confusing experience. I addressed this by defining a consistent item shape and making the Lambda export step responsible for validation. The export should reject or report records without required identifiers, normalize optional text values, sort cards deterministically, and produce valid UTF-8 JSON. This creates a quality gate between editable data and the public website.

The second challenge was keeping the website fresh without making it dynamic. A static site is inexpensive and reliable, but static files can become stale. The scheduled Lambda job solved this by regenerating the public JSON snapshot from DynamoDB. Uploading to a consistent S3 object key means the frontend does not need to know which database revision is active. For production hardening, the generated output can first be written to a temporary key, validated, and then copied to the final key so visitors never receive a partially written artifact.

A third challenge was client-side performance. Rendering hundreds of rich cards can become expensive on smaller devices. I kept the card markup compact, performed filtering in memory, rendered only the active result set, and used a modal for expanded details rather than placing every field in every card by default. The compact/full-card toggle gives users control over information density.

The fourth challenge involved AWS permissions. The Lambda function needs to read the DynamoDB table and write specific generated objects to S3, but it should not have broad administrative access. I used a dedicated IAM execution role and a least-privilege policy restricted to the required table and bucket prefix. CloudWatch Logs from the Lambda runtime provide an audit trail for export counts, validation failures, and upload errors.

Finally, creative design was a challenge of its own. A card had to be concise enough to use during a live conversation while still showing tradeoffs. The combination of a speaking line, side effect, advantage, and card-combination suggestion prevents the advice from feeling one-dimensional. It invites the player to think about both action and consequence.

AWS Services Used and Architecture Overview

Amazon S3

Amazon S3 hosts index.html, styles, browser-side JavaScript, images, and generated multilingual card files such as card_en.json. S3 static website hosting provides the public entry point and serves the assets requested by the browser. The bucket is dedicated to delivery, not content editing.

Amazon DynamoDB

DynamoDB stores each card as an independent item. A stable identifier acts as the partition key, while attributes hold the number, title, role, leadership principle, speaking line, side effect, advantage, combination guidance, and skill rating. This model supports targeted updates and future additions such as status, language, deck version, or review metadata.

AWS Lambda

The export Lambda function reads the table, handles pagination when scanning or querying, validates the records, sorts them, assembles the expected JSON payload, and writes the latest output to S3. It also logs the number of exported cards and any validation issues. Keeping this transformation in Lambda means no server needs to run continuously.

Amazon EventBridge Scheduler

EventBridge Scheduler invokes the export function at a defined interval. The schedule can be hourly, daily, or adjusted to match the content-update frequency. A scheduled snapshot is a good fit because card changes do not need sub-second publication.

AWS Identity and Access Management

IAM connects the services securely. The scheduler receives permission to invoke only the export Lambda function. The Lambda execution role receives read access to the specific DynamoDB table, write access to the generated S3 object prefix, and permission to create runtime logs.

Amazon CloudWatch

Lambda writes execution logs to CloudWatch Logs. These logs make it easier to troubleshoot missing records, permission problems, JSON generation failures, and unsuccessful S3 uploads. Metrics and alarms can be added to report function errors or repeated failed invocations.

Architecture Diagram

Request and Publication Flow

  1. A card is added to or updated in DynamoDB.
  2. EventBridge Scheduler invokes the Lambda export function at the configured time.
  3. Lambda reads all eligible card items, including additional pages of results when necessary.
  4. The function validates required fields and creates an ordered JSON document.
  5. Lambda uploads the generated file to the S3 website bucket using the object key expected by the frontend.
  6. A visitor opens the site and receives index.html from S3.
  7. The browser fetches the current language file, such as card_en.json, from the same bucket.
  8. JavaScript renders the deck and performs subsequent game interactions locally.

This architecture has a useful separation of concerns. DynamoDB is optimized for maintaining records. Lambda is responsible for transformation and publication. S3 is optimized for inexpensive static delivery. EventBridge Scheduler controls freshness. The browser provides the interactive creative experience.

What I Learned

The biggest lesson was that a creative application does not have to require a complex backend. The creative value in this project comes from the relationship between the card content and the interactions around it. A lightweight static frontend can still support a rich activity when the content model and user flow are designed carefully.

I also learned to think of generated JSON as a publication artifact rather than the source of truth. Before this project, it would have been tempting to upload a large JSON file manually whenever the deck changed. Storing cards individually in DynamoDB and generating a clean snapshot creates a much safer workflow. It supports validation, predictable ordering, automated refreshes, and future editorial tools without adding database calls to the public application.

The challenge strengthened my understanding of scheduled serverless workloads. Lambda is often demonstrated behind an API, but this project uses it as a reliable publishing worker. EventBridge Scheduler provides the timing, Lambda performs a bounded transformation, and S3 receives the result. This is a simple pattern that can also work for catalogs, feeds, reports, configuration snapshots, and localized content bundles.

I gained practical experience with IAM boundaries as well. It is easy to make an early prototype work by granting broad permissions, but the final architecture is clearer when every permission corresponds to a specific data flow. The scheduler invokes one function. The function reads one table, writes to one bucket prefix, and emits logs. Thinking through those boundaries improved both security and my understanding of the system.

On the frontend, I learned that progressive complexity is valuable. I did not start by implementing multilingual gameplay for six players. I started by making one card render correctly. Search and filters came next, followed by detail views, language switching, the full-deck display, and finally the multiplayer round flow. Each layer reused the same normalized card objects, so the application grew without requiring a rewrite.

I also learned that accessibility and responsiveness are creative constraints, not cleanup tasks. A card game that works only with a mouse or only on a desktop excludes many potential workshop settings. Responsive single-column layouts, usable touch targets, keyboard behavior, clear focusable controls, dialog labels, and reduced-motion support make the experience more adaptable.

Most importantly, I learned how content structure shapes conversation. The “speaking line” makes the advice concrete. The “side effect” acknowledges that leadership actions have costs. The “advantage” explains the potential payoff. The “combination” field encourages players to connect ideas rather than treat each card as an isolated rule. Technology delivers the deck, but this repeated creative structure is what makes the app useful.

Link to the App

Try the deployed application here:

Live app: https://vertexmacro.com/cloud_club/demo/leadership_card_game/index.html

The live app is the main submission link. It demonstrates the searchable card library, detailed card views, language switching, basic and advanced decks, player setup, random dealing, speaker rotation, and new-round flow.

Closing Thoughts

The Leadership Card Game started as a weekend idea: turn leadership guidance into cards that people can actually speak and play. Keeping the first version focused allowed me to invest in the experience instead of infrastructure. S3 provides the static website, DynamoDB stores structured card records, Lambda converts those records into the latest website-ready JSON, and EventBridge Scheduler keeps publication automatic.

The project also leaves room to grow. Future versions could add an authenticated editorial interface, draft and published states, deck versioning, additional languages, usage analytics that respect player privacy, or CloudFront for HTTPS delivery and global caching. The core architecture does not need to change for those additions. The important foundation is already present: a clear source of truth, an automated publishing path, a fast static experience, and a creative format that helps people practice better conversations.

If a player draws one card and finds a more thoughtful way to approach a difficult discussion, the app has done its job. If a facilitator uses the deck to help a team create repeatable opportunities for others, it has done even more.