{"id":109,"date":"2025-11-03T23:44:42","date_gmt":"2025-11-04T04:44:42","guid":{"rendered":"https:\/\/wp.stgeorges.bc.ca\/connork\/?p=109"},"modified":"2025-12-11T14:56:00","modified_gmt":"2025-12-11T19:56:00","slug":"a-glanceable-finance-robot-arduino-stock-ticker-with-servo","status":"publish","type":"post","link":"https:\/\/wp.stgeorges.bc.ca\/connork\/2025\/11\/03\/a-glanceable-finance-robot-arduino-stock-ticker-with-servo\/","title":{"rendered":"A Glanceable Finance Robot: Arduino Stock Ticker with Servo"},"content":{"rendered":"\n<h4 class=\"wp-block-heading\">Introduction<\/h4>\n\n\n\n<p>When I started this project, my goal was simple: <strong>make a robot that moves<\/strong>. But, I wanted it to move for a reason.<br>I\u2019ve always liked when information feels tactile. Numbers on a screen are easy to ignore, but a servo arm sweeping up when a stock jumps 3% instantly catches your attention. That idea ended up becoming the foundation for this build.<\/p>\n\n\n\n<p>The project\u2019s objective was to demonstrate all the robotics basics we were asked to show: circuit building, Arduino programming, and physical motion, but I wanted to frame it around something that actually felt useful to me. So I wanted to build something I was actually impressed with. That ended up being a finance-themed Arduino robot: a stock ticker dashboard that displays simulated market data on an LCD, flashes LEDs to show gains or losses, plays a short buzzer tone when the market spikes, and most importantly, moves a servo needle to visualize percentage change.<\/p>\n\n\n\n<p>It started in Tinkercad as a virtual prototype, then evolved into a physical circuit. Along the way, I used AI to accelerate design and debugging, acting almost like a lab assistant that could instantly sketch code or explain pin mapping when I got stuck.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">The Intended Device<\/h4>\n\n\n\n<p>The final device simulates real-time market data and converts it into physical<strong> <\/strong>motion.<\/p>\n\n\n\n<h5 class=\"wp-block-heading\">Inputs<\/h5>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Simulated stock data (randomized within realistic daily change ranges).<\/li>\n\n\n\n<li>Manual button controls to cycle between symbols.<\/li>\n<\/ul>\n\n\n\n<h5 class=\"wp-block-heading\">Outputs<\/h5>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>16\u00d72 LCD<\/strong> showing ticker symbol, current price, and percentage change.<\/li>\n\n\n\n<li><strong>Green LED<\/strong> when gain &gt; 0.05%, <strong>red LED<\/strong> when loss &lt; \u22120.05%.<\/li>\n\n\n\n<li><strong>Active buzzer<\/strong> for large absolute changes (&gt; 2%).<\/li>\n\n\n\n<li><strong>Servo gauge (SG90)<\/strong> that maps \u22125% \u2192 0\u00b0, 0% \u2192 90\u00b0, +5% \u2192 180\u00b0, so it physically \u201cswings\u201d with the market.<\/li>\n<\/ul>\n\n\n\n<h5 class=\"wp-block-heading\">Purpose<\/h5>\n\n\n\n<p>It doesn\u2019t just print numbers, it <span style=\"text-decoration: underline\">acts out<\/span> what the market is actually doing. The servo transforms data into movement, which is the robotics component that meets the assignment\u2019s \u201cdevice must move something\u201d criterion.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Virtual Prototype and Circuit<\/h4>\n\n\n\n<h5 class=\"wp-block-heading\">Circuit Schematic &#8211; How It Works<\/h5>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"736\" src=\"https:\/\/wp.stgeorges.bc.ca\/connork\/wp-content\/uploads\/sites\/21\/2025\/11\/Screenshot-2025-11-03-at-8.33.48-PM-1024x736.png\" alt=\"\" class=\"wp-image-111\" srcset=\"https:\/\/wp.stgeorges.bc.ca\/connork\/wp-content\/uploads\/sites\/21\/2025\/11\/Screenshot-2025-11-03-at-8.33.48-PM-1024x736.png 1024w, https:\/\/wp.stgeorges.bc.ca\/connork\/wp-content\/uploads\/sites\/21\/2025\/11\/Screenshot-2025-11-03-at-8.33.48-PM-300x216.png 300w, https:\/\/wp.stgeorges.bc.ca\/connork\/wp-content\/uploads\/sites\/21\/2025\/11\/Screenshot-2025-11-03-at-8.33.48-PM-768x552.png 768w, https:\/\/wp.stgeorges.bc.ca\/connork\/wp-content\/uploads\/sites\/21\/2025\/11\/Screenshot-2025-11-03-at-8.33.48-PM-1536x1104.png 1536w, https:\/\/wp.stgeorges.bc.ca\/connork\/wp-content\/uploads\/sites\/21\/2025\/11\/Screenshot-2025-11-03-at-8.33.48-PM.png 1842w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>In Tinkercad, I began by laying out the basic connections:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Component<\/th><th>Arduino Pin<\/th><th>Notes<\/th><\/tr><\/thead><tbody><tr><td>LCD 16\u00d72<\/td><td>RS = 12, E = 11, D4 = 5, D5 = 4, D6 = 3, D7 = 2<\/td><td>Backlight through 220 \u03a9 resistor<\/td><\/tr><tr><td>Green LED<\/td><td>D6 (with 220 \u03a9)<\/td><td>Gain indicator<\/td><\/tr><tr><td>Red LED<\/td><td>D7 (with 220 \u03a9)<\/td><td>Loss indicator<\/td><\/tr><tr><td>Buzzer<\/td><td>D8<\/td><td>Audio alert<\/td><\/tr><tr><td>Servo (SG90)<\/td><td>D9<\/td><td>Signal; powered at 5 V<\/td><\/tr><tr><td>Buttons<\/td><td>A1 = next, A2 = prev<\/td><td>INPUT_PULLUP mode<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p>All grounds are shared. The backlight has its own resistor to avoid the \u201c7000 A\u201d simulation bug that Tinkercad throws (that I also got earlier) if you wire it directly to 5 V.<\/p>\n\n\n\n<p>Once wired, I ran the circuit on Tinkercad\u2019s simulator; no API calls yet, just random price deltas to test out the functionality. The servo arm moved and LEDs blinked. Well, this had to have been at least a quarter of the way to a Bloomberg terminal.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"728\" src=\"https:\/\/wp.stgeorges.bc.ca\/connork\/wp-content\/uploads\/sites\/21\/2025\/11\/Screenshot-2025-11-03-at-8.33.15-PM-1024x728.png\" alt=\"\" class=\"wp-image-112\" srcset=\"https:\/\/wp.stgeorges.bc.ca\/connork\/wp-content\/uploads\/sites\/21\/2025\/11\/Screenshot-2025-11-03-at-8.33.15-PM-1024x728.png 1024w, https:\/\/wp.stgeorges.bc.ca\/connork\/wp-content\/uploads\/sites\/21\/2025\/11\/Screenshot-2025-11-03-at-8.33.15-PM-300x213.png 300w, https:\/\/wp.stgeorges.bc.ca\/connork\/wp-content\/uploads\/sites\/21\/2025\/11\/Screenshot-2025-11-03-at-8.33.15-PM-768x546.png 768w, https:\/\/wp.stgeorges.bc.ca\/connork\/wp-content\/uploads\/sites\/21\/2025\/11\/Screenshot-2025-11-03-at-8.33.15-PM.png 1072w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<h5 class=\"wp-block-heading\">Bill of Materials (BOM)<\/h5>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Part<\/th><th>Qty<\/th><th>Description<\/th><\/tr><\/thead><tbody><tr><td>Arduino Uno R3<\/td><td>1<\/td><td>Microcontroller<\/td><\/tr><tr><td>16\u00d72 LCD display<\/td><td>1<\/td><td>Output screen<\/td><\/tr><tr><td>SG90 micro-servo<\/td><td>1<\/td><td>Mechanical actuator<\/td><\/tr><tr><td>Green + Red LEDs<\/td><td>2<\/td><td>Gain\/Loss indicators<\/td><\/tr><tr><td>220 \u03a9 resistors<\/td><td>3<\/td><td>Current limiting<\/td><\/tr><tr><td>Active buzzer<\/td><td>1<\/td><td>Alert tone<\/td><\/tr><tr><td>Breadboard + wires<\/td><td>1 set<\/td><td>Circuit base<\/td><\/tr><tr><td>(Optional) Buttons<\/td><td>2<\/td><td>Navigate tickers<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h4 class=\"wp-block-heading\">Code &#8211; How It Works<\/h4>\n\n\n\n<p>I wrote the code modularly with functions like <code>simulateMarketJitter()<\/code>, <code>redraw()<\/code>, and <code>updateGauge()<\/code> so each handled one task.<\/p>\n\n\n\n<p>The simulation runs every three seconds, picking new random \u00b1% changes to mimic stock volatility. The display, LEDs, buzzer, and servo update together.<\/p>\n\n\n\n<p>Example excerpt:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>void updateGauge(float changePct) {\n  float capped = constrain(changePct, -5.0, 5.0);\n  int target = (int)round(mapFloat(capped, -5.0, 5.0, 0.0, 180.0));\n  int step = (target &gt; lastAngle) ? 2 : -2;\n  for (int a = lastAngle; a != target; a += step) {\n    gauge.write(a);\n    delay(12);\n  }\n  lastAngle = target;\n}<\/code><\/pre>\n\n\n\n<p><strong>Code explanation:<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>constrain()<\/code> prevents unrealistic motion beyond \u00b15%.<\/li>\n\n\n\n<li><code>mapFloat()<\/code> converts percentage change into servo angle.<\/li>\n\n\n\n<li>Small step delay smooths the motion so it feels analog instead of jerky.<\/li>\n<\/ul>\n\n\n\n<h5 class=\"wp-block-heading\">Prototype Demo<\/h5>\n\n\n\n<p>In simulation, every few seconds the LCD changes:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>NVDA 207.3\n+1.9%<\/code><\/pre>\n\n\n\n<p>This causes the servo to swing upward, leading to green LED lights and a short buzzer pulse.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Physical Prototype<a href=\"\"><\/a><\/h4>\n\n\n\n<p>After the simulation worked, I rebuilt it on a real breadboard.<\/p>\n\n\n\n<p>I immediately learned that power delivery mattered more in real life. The servo briefly reset the Arduino when it drew too much current on sudden jumps. The fix was to move the servo to an external 5 V rail while keeping a common ground.<\/p>\n\n\n\n<p>The rest transferred cleanly from Tinkercad: same pinout, same code. The only tuning was reducing the tone volume by adding a resistor in series with the buzzer so it wouldn\u2019t be distracting.<\/p>\n\n\n\n<p><strong>What I learned:<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Simulations don\u2019t model current draw or electrical noise.<\/li>\n\n\n\n<li>Real wiring forces you to think about wire length, shared grounds, and stable voltage.<\/li>\n\n\n\n<li>Even a simple robot introduces system-level thinking that I have yet to utilise prior to this point. This resulted in mechanical, electrical, and software layers to all be interacting.<\/li>\n<\/ul>\n\n\n\n<h4 class=\"wp-block-heading\">Arduino Programming<\/h4>\n\n\n\n<ul class=\"wp-block-list\">\n<li>The ticker cycles through an array using modulo indexing.<\/li>\n\n\n\n<li>The servo angle directly depends on computed <code>changePct<\/code>.<\/li>\n\n\n\n<li>LEDs and buzzer thresholds act as visual and auditory \u201csensors.\u201d<\/li>\n\n\n\n<li>Debounce code ensures buttons aren\u2019t triggered multiple times per press.<\/li>\n<\/ul>\n\n\n\n<p>The main loop is small but expressive, aiming to combine time-based updates with manual control:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>if (millis() - lastAutoUpdate &gt; 3000) {\n  simulateMarketJitter();\n  redraw();\n  idx = (idx + 1) % n;\n}\n\n<\/code><\/pre>\n\n\n\n<p>That single snippet captures computational thinking: time control, state change, and loop iteration.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Testing and Debugging<\/h4>\n\n\n\n<p>My debugging process was data-driven:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>LCD blank screen:<\/strong> fixed by confirming <code>lcd.begin(16,2)<\/code> and adjusting contrast with potentiometer.<\/li>\n\n\n\n<li><strong>Backlight overcurrent warning:<\/strong> solved by 220 \u03a9 resistor.<\/li>\n\n\n\n<li><strong>Servo overshoot:<\/strong> introduced <code>abs(targetAngle - lastAngle) &lt; 2<\/code> deadband.<\/li>\n\n\n\n<li><strong>Buzzer too loud:<\/strong> series resistor (~100 \u03a9).<\/li>\n<\/ul>\n\n\n\n<p>Each problem forced me to identify cause, test, iterate. This is the same loop real engineers (and I try to as well) use. <strong>My iterations went as followed:<\/strong><\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>v1:<\/strong> LCD only, static prices.<\/li>\n\n\n\n<li><strong>v2:<\/strong> Added servo gauge \u2192 movement achieved.<\/li>\n\n\n\n<li><strong>v3:<\/strong> Added LEDs, buzzer, and smoother motion.<\/li>\n\n\n\n<li><strong>v4 (next):<\/strong> Upgrade to ESP32 for live data, add a small acrylic enclosure, maybe an OLED or LED matrix.<\/li>\n<\/ol>\n\n\n\n<h3 class=\"wp-block-heading\">Final Demo<\/h3>\n\n\n\n<figure class=\"wp-block-video\"><video height=\"1752\" style=\"aspect-ratio: 3026 \/ 1752;\" width=\"3026\" controls src=\"http:\/\/wp.stgeorges.bc.ca\/connork\/wp-content\/uploads\/sites\/21\/2025\/11\/Screen-Recording-2025-11-24-at-8.38.09-PM-online-video-cutter.com_.mp4\"><\/video><\/figure>\n\n\n\n<p>When you run the simulation, the device transforms into a living market ticker. Here is the step-by-step loop that occurs every 3 seconds:<\/p>\n\n\n\n<ol start=\"1\" class=\"wp-block-list\">\n<li>The Arduino generates a randomized volatility event (e.g., &#8220;NVDA jumps +4.2%&#8221;).<\/li>\n\n\n\n<li>The code constrains this percentage and maps it to a servo angle. We treat 0% change as 90\u00b0 (center), so a rally pulls the needle right (180\u00b0) and a crash pulls it left (0\u00b0).<\/li>\n\n\n\n<li><strong>The Physical Output:<\/strong>\n<ul class=\"wp-block-list\">\n<li>Visually, the LCD updates the price, and the <strong>Green LED<\/strong> lights up to signal profit.<\/li>\n\n\n\n<li>Kinetically, the servo arm sweeps to the new position. I added a slight delay in the loop so the needle &#8220;swings&#8221; with momentum rather than snapping instantly, mimicking the tension of a live market move.<\/li>\n\n\n\n<li>Audibly, if the change is drastic (greater than 2%), the buzzer fires a short alert tone.<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n\n\n\n<p>Instead of reading a static number, you feel the market movement and it takes your attention during huge moves. No guarantees this protects your portfolio, though.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"768\" height=\"1024\" src=\"https:\/\/wp.stgeorges.bc.ca\/connork\/wp-content\/uploads\/sites\/21\/2025\/11\/495E0130-976E-4204-8327-6099B9BA0DA3_1_102_o-768x1024.jpeg\" alt=\"\" class=\"wp-image-140\" srcset=\"https:\/\/wp.stgeorges.bc.ca\/connork\/wp-content\/uploads\/sites\/21\/2025\/11\/495E0130-976E-4204-8327-6099B9BA0DA3_1_102_o-768x1024.jpeg 768w, https:\/\/wp.stgeorges.bc.ca\/connork\/wp-content\/uploads\/sites\/21\/2025\/11\/495E0130-976E-4204-8327-6099B9BA0DA3_1_102_o-225x300.jpeg 225w, https:\/\/wp.stgeorges.bc.ca\/connork\/wp-content\/uploads\/sites\/21\/2025\/11\/495E0130-976E-4204-8327-6099B9BA0DA3_1_102_o-1152x1536.jpeg 1152w, https:\/\/wp.stgeorges.bc.ca\/connork\/wp-content\/uploads\/sites\/21\/2025\/11\/495E0130-976E-4204-8327-6099B9BA0DA3_1_102_o.jpeg 1536w\" sizes=\"auto, (max-width: 768px) 100vw, 768px\" \/><\/figure>\n\n\n\n<p>In terms of the physical build, I wasn&#8217;t able to finish it in the time provided. However, I am currently finding the parts to turn this build into reality. <\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Reflections on Use of AI<\/h4>\n\n\n\n<h5 class=\"wp-block-heading\">Process<\/h5>\n\n\n\n<ul class=\"wp-block-list\">\n<li>I described what I wanted (\u201ca finance-themed Arduino robot that moves\u201d).<\/li>\n\n\n\n<li>The AI generated candidate designs, part lists, and starter code.<\/li>\n\n\n\n<li>I refined each step: adding simulation-friendly logic, replacing web calls with mock data, and ensuring resistor safety.<\/li>\n<\/ul>\n\n\n\n<h5 class=\"wp-block-heading\">Why It Worked<\/h5>\n\n\n\n<p>AI condensed what would have been hours of forum-searching into minutes. It didn\u2019t remove the need for understanding; it accelerated it.<\/p>\n\n\n\n<h5 class=\"wp-block-heading\">What Didn\u2019t Work<\/h5>\n\n\n\n<p>Tinkercad doesn\u2019t allow Wi-Fi libraries, so I had to fake the data.<\/p>\n\n\n\n<p>That limitation forced me to separate logic (display + motion) from input (price feed), which ironically improved modular design.<\/p>\n\n\n\n<p>My lesson from this was using AI responsibly isn\u2019t about copying answers, but more about asking better questions.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Ethics, Sustainability, and Privacy<\/h4>\n\n\n\n<ul class=\"wp-block-list\">\n<li>When I add live APIs later, the design keeps API keys local and avoids cloud dependencies.<\/li>\n\n\n\n<li>The project uses common, re-usable parts. Nothing was glued or soldered permanently.<\/li>\n\n\n\n<li>Both LEDs and textual symbols (+\/\u2212) make the display readable to color-blind users.<\/li>\n\n\n\n<li>The device visualizes information without promoting real trading; it\u2019s purely educational.<\/li>\n<\/ul>\n\n\n\n<h4 class=\"wp-block-heading\">Conclusion<\/h4>\n\n\n\n<p>The final product is simple but complete: an Arduino robot that combines hardware, software, and creativity into something that actually moves with purpose.<\/p>\n\n\n\n<p>It visualizes stock data physically, making otherwise abstract numbers intuitive and also giving a physical alternative to looking at stock prices on a screen.<\/p>\n\n\n\n<p>Through this, I met every requirement of the robotics project, <strong>circuit building, coding, motion, and documentation.<\/strong> On top of this, I learned more about control systems, debugging, and how AI can be a genuine accelerant for hands-on learning.<\/p>\n\n\n\n<p>Next step:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>port it to an ESP32<\/li>\n\n\n\n<li>pull real-time prices from an API<\/li>\n\n\n\n<li>3D-print an enclosure so it looks like a real desktop gauge.<\/li>\n<\/ul>\n\n\n\n<p>Still though, it\u2019s already a working robot that bridges finance, code, and motion together.<\/p>\n\n\n\n<p><strong>Appendices<\/strong><\/p>\n\n\n\n<p>Tinkercad Link: <a href=\"https:\/\/www.tinkercad.com\/things\/lRPvYnqmoON-stock-ticker?sharecode=hU9nZSsUYWFov2j3DLgzLQUjvtdAecAxG6dyqkGC4ig\">https:\/\/www.tinkercad.com\/things\/lRPvYnqmoON-stock-ticker?sharecode=hU9nZSsUYWFov2j3DLgzLQUjvtdAecAxG6dyqkGC4ig<\/a><\/p>\n\n\n\n<p>AI Transcript: <a href=\"https:\/\/docs.google.com\/document\/d\/11tibHoaTOvoEQtsQXAqJEDCrnXzpM4t7cjifpVJ2WWY\/edit?usp=sharing\">https:\/\/docs.google.com\/document\/d\/11tibHoaTOvoEQtsQXAqJEDCrnXzpM4t7cjifpVJ2WWY\/edit?usp=sharing<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Introduction When I started this project, my goal was simple: make a robot that moves. But, I wanted it to move for a reason.I\u2019ve always liked when information feels tactile. Numbers on a screen are easy to ignore, but a servo arm sweeping up when a stock jumps 3% instantly catches your attention. That idea [&hellip;]<\/p>\n","protected":false},"author":19,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-109","post","type-post","status-publish","format-standard","hentry","category-uncategorized"],"jetpack_featured_media_url":"","_links":{"self":[{"href":"https:\/\/wp.stgeorges.bc.ca\/connork\/wp-json\/wp\/v2\/posts\/109","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wp.stgeorges.bc.ca\/connork\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wp.stgeorges.bc.ca\/connork\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wp.stgeorges.bc.ca\/connork\/wp-json\/wp\/v2\/users\/19"}],"replies":[{"embeddable":true,"href":"https:\/\/wp.stgeorges.bc.ca\/connork\/wp-json\/wp\/v2\/comments?post=109"}],"version-history":[{"count":6,"href":"https:\/\/wp.stgeorges.bc.ca\/connork\/wp-json\/wp\/v2\/posts\/109\/revisions"}],"predecessor-version":[{"id":151,"href":"https:\/\/wp.stgeorges.bc.ca\/connork\/wp-json\/wp\/v2\/posts\/109\/revisions\/151"}],"wp:attachment":[{"href":"https:\/\/wp.stgeorges.bc.ca\/connork\/wp-json\/wp\/v2\/media?parent=109"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wp.stgeorges.bc.ca\/connork\/wp-json\/wp\/v2\/categories?post=109"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wp.stgeorges.bc.ca\/connork\/wp-json\/wp\/v2\/tags?post=109"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}