{"boards":{"esp32":{"detail":"The older, wider devkit with a single micro-USB port.","fqbn":"esp32:esp32:esp32","label":"ESP32 (classic WROOM-32 devkit)","pins":[23,22,21,19,18,17,16,4,13,14,25,26,27,32,33]},"esp32s3":{"detail":"The newer board. Often has two USB ports -- see the note below.","fqbn":"esp32:esp32:esp32s3","label":"ESP32-S3 (WROOM-1)","pins":[4,5,6,7,15,16,17,18,8,9,10,11,12,13,14,21]}},"categories":["everyday","home","media","productivity","system"],"firmware":[{"bytes":13695,"file":"light_test.ino","name":"light_test","relative_path":"esp32_firmware/light_test/light_test.ino"},{"bytes":9483,"file":"relay_board.ino","name":"relay_board","relative_path":"esp32_firmware/relay_board/relay_board.ino"}],"generated_at":"2026-08-07T09:28:47+00:00","needs_copy_review":{},"skill_count":13,"skills":[{"action_count":1,"actions":[{"description":"Get the current weather and temperature for a location","id":"get_current"}],"capabilities":["weather.query"],"category":"everyday","credentials":[],"description":"Reports current weather and temperature for a location using a free, keyless weather API.","difficulty":"easy","firmware":null,"hardware":[],"has_store_meta":true,"id":"weather","name":"Weather","needs_account":false,"needs_hardware":false,"notes":"","package":"weather-1.0.0.zip","package_bytes":4519,"requirements":["network"],"setup_steps":["Install it.","Set your default location in the skill's config.","Ask: 'what's the weather?'"],"status":"stable","summary":"Current conditions for your default location or anywhere you name, answered in one sentence instead of a forecast table.","tagline":"Weather, in one spoken line","version":"1.0.0","voice_examples":["what is the weather today","aaj ka weather kya hai","weather kaisa hai","what is the temperature outside","temperature kitna hai","how hot is it outside"],"what_it_does":["Current conditions and how it feels","Any city on request","Results cached briefly so repeats are instant"],"wiring":[]},{"action_count":3,"actions":[{"description":"Switch something on. 'target' must be the name of one of the switches in this skill's devices registry.","id":"turn_on"},{"description":"Switch something off. 'target' must be the name of one of the switches in this skill's devices registry.","id":"turn_off"},{"description":"Check whether one switch, or everything, is currently on or off","id":"get_status"}],"capabilities":["light.control","switch.control"],"category":"home","credentials":[],"description":"Switches household things wired to relay boards -- bedroom light, hall light, fan, geyser, anything the user has named on the Relays page. The available switches are listed in this skill's devices registry; always pass the one the user actually named as 'target'.","difficulty":"moderate","firmware":{"board_types":["esp32s3","esp32"],"note":"Flashed for you from the dashboard's Relays page -- you do not need the Arduino IDE.","sketch":"relay_board"},"hardware":[{"name":"ESP32-S3-WROOM-1 or classic ESP32 (WROOM-32) devkit","notes":"Both are supported. The dashboard prints the exact GPIO for each relay once you pick the board type.","required":true},{"name":"Relay module (1, 2, 4, 8 or 16 channel)","notes":"Opto-isolated boards are strongly preferred when switching mains.","required":true},{"name":"5V power supply for the relay board","notes":"Power the ESP32 from its own clean supply and share only ground -- see the note below.","required":true},{"name":"USB cable (data, not charge-only)","notes":"Only needed for the one-time flash. After that the board runs over WiFi.","required":true}],"has_store_meta":true,"id":"relay_control","name":"Household Switches","needs_account":false,"needs_hardware":true,"notes":"Your ESP32 must join a 2.4GHz network -- ESP32s cannot see 5GHz at all. Onboarding checks this and reads the board's own verdict back over USB, so a wrong password fails in about 20 seconds instead of becoming a board that mysteriously never appears.","package":"relay_control-1.0.0.zip","package_bytes":6096,"requirements":["network","configured_device"],"setup_steps":["Open the Relays page in your dashboard and plug the board in over USB.","Pick your board type and how many relays it has. The page prints the exact GPIO for each one.","Wire the relay INs to those GPIOs, and share a common ground with the ESP32.","Give each relay a name (and a room, e.g. name 'light', room 'bedroom').","Flash from the page, test each relay while still on the cable, then unplug and run it from any adapter."],"status":"stable","summary":"Wire an ESP32 to a relay module and Jarvis can switch anything mains-powered -- lights, fans, plugs -- by voice, in English, Hinglish or Hindi. Onboard as many boards as you like from the dashboard; naming a switch there changes what the voice command means immediately, with no reflash.","tagline":"Switch real lights, fans and plugs by voice","version":"1.0.0","voice_examples":["turn on the bedroom light","switch on the hall light","bedroom light on karo","pankha chala do","geyser on kar do","\u0932\u093e\u0907\u091f \u0911\u0928 \u0915\u0930\u094b"],"what_it_does":["Turns named switches on and off, individually or all at once","Reads names from your own registry, so 'bedroom light' means whatever you called it","Runs on a deterministic local fast path -- typically ~0.03s, and works with no internet"],"wiring":[]},{"action_count":3,"actions":[{"description":"Turn the side lamp on. Restores its last color, or white if none has been set yet.","id":"turn_on"},{"description":"Turn the side lamp off","id":"turn_off"},{"description":"Change the side lamp's color and turn it on in that color","id":"set_color"}],"capabilities":["light.control"],"category":"home","credentials":[],"description":"Controls the LED side lamp wired to Jarvis -- on, off, and color. Separate from the emotion-state animations, which are dashboard-only.","difficulty":"easy","firmware":null,"hardware":[{"name":"Addressable LED strip or ring (WS2812B / SK9822 class)","required":true},{"name":"5V supply for the LEDs","required":true}],"has_store_meta":true,"id":"side_lamp","name":"Side Lamp","needs_account":false,"needs_hardware":true,"notes":"","package":"side_lamp-1.0.0.zip","package_bytes":3766,"requirements":[],"setup_steps":["Wire the LED data line to the marked pins.","Power the LEDs from a 5V supply, sharing ground.","Open the Side Lamp page and press Test."],"status":"stable","summary":"An SPI-driven LED lamp wired straight into Jarvis -- no WiFi, no second board. It glows with Jarvis's current state and can pulse in time with music or speech.","tagline":"An LED lamp that shows what Jarvis is doing","version":"1.0.0","voice_examples":["turn on the lamp","lamp on","switch on the side lamp","lamp ko on karo","\u0932\u0948\u0902\u092a \u0911\u0928 \u0915\u0930\u094b","turn off the lamp"],"what_it_does":["On, off and colour by voice","Reacts to music and to Jarvis speaking","Wired directly in, so there is no network for it to drop off"],"wiring":[{"connects_to":"LED data in","pin":"Header pin 19 (SPI MOSI)"},{"connects_to":"LED clock (clocked strips only)","pin":"Header pin 23 (SPI SCLK)"},{"connects_to":"Shared ground with the LED supply","pin":"GND"}]},{"action_count":1,"actions":[{"description":"Capture a frame from the camera and describe what's visible, or answer a specific question about the scene","id":"describe"}],"capabilities":["vision.describe"],"category":"home","credentials":[{"how":"Add it on the OpenAI Key page in your dashboard. Vision calls are billed per use.","name":"OpenAI API key"}],"description":"Looks through the camera and describes what it currently sees, or answers a specific question about the scene.","difficulty":"easy","firmware":null,"hardware":[{"name":"USB camera (UVC)","notes":"Any standard USB webcam. Single-shot capture is used, so cheap cameras work fine.","required":true}],"has_store_meta":true,"id":"vision","name":"Vision","needs_account":true,"needs_hardware":true,"notes":"","package":"vision-1.0.0.zip","package_bytes":4158,"requirements":["network","configured_device"],"setup_steps":["Plug in a USB camera.","Add your OpenAI key.","Open the Camera page and confirm the live view.","Optionally turn on door watch -- it is off by default because each check costs money."],"status":"stable","summary":"Point a USB camera at a door or a room and ask Jarvis what it sees. Also underpins the optional door watch, which uses cheap local motion detection to decide when a paid vision call is worth making.","tagline":"Ask what the camera can see","version":"1.0.0","voice_examples":["what do you see","what can you see right now","look at the camera and tell me what's there","camera se dekho kya hai","kya dikh raha hai abhi","is anyone in the room"],"what_it_does":["Answers 'what do you see' from a live camera frame","Feeds the optional door-watch alerts","Local motion detection gates the paid call, so an idle room costs nothing"],"wiring":[]},{"action_count":5,"actions":[{"description":"Turn the wall light on. Resumes its last color and brightness.","id":"turn_on"},{"description":"Turn the wall light off","id":"turn_off"},{"description":"Change the wall light's color and turn it on in that color","id":"set_color"},{"description":"Set the wall light's brightness as a percentage (0-100)","id":"set_brightness"},{"description":"Check whether the wall light is on/off and its current brightness","id":"get_status"}],"capabilities":["light.control"],"category":"home","credentials":[],"description":"Controls the two WS2812 wall strip lights -- on, off, color, and brightness. Music Sync and animation picking stay dashboard-only.","difficulty":"moderate","firmware":{"board_types":["esp32"],"note":"Only needs reflashing if the control endpoints change -- never for animation tweaks.","sketch":"light_test"},"hardware":[{"name":"ESP32 devkit","required":true},{"name":"WS2812B / NeoPixel LED strips (2)","notes":"Wired from one end through to the other; lengths are configured in the dashboard.","required":true},{"name":"5V power supply sized for your LED count","notes":"WS2812B needs real 5V. Do not power the strip from the ESP32's 3V3 pin -- it produces no light at all.","required":true}],"has_store_meta":true,"id":"wall_light","name":"Wall Light","needs_account":false,"needs_hardware":true,"notes":"Two things cost real hours during bring-up. (1) The ESP32's 3.3V data line is marginal for WS2812B and can fail part-way down a long chain. (2) Powering the ESP32 from the same rail as the LEDs stopped it joining WiFi entirely -- the radio is far more noise-sensitive than the logic. Give the board its own supply and share only ground.","package":"wall_light-1.0.0.zip","package_bytes":4443,"requirements":["network","configured_device"],"setup_steps":["Flash the sketch to a spare ESP32.","Wire strip 1 data to GPIO18 and strip 2 data to GPIO19, sharing ground with the strip supply.","Power the strips from a real 5V supply, and give the ESP32 its own separate supply.","Set the strip lengths on the Wall Light page.","Turn on music sync and play something."],"status":"stable","summary":"Two WS2812B strips driven by a small wireless controller, rendered entirely by Jarvis and streamed over UDP. Animation runs inside Jarvis, so changing an effect is a settings change -- never a reflash.","tagline":"Addressable LED strips that react to your music","version":"1.0.0","voice_examples":["turn on the wall light","wall light on","switch on the strip light","wall light ko on karo","\u0926\u0940\u0935\u093e\u0930 \u0915\u0940 \u0932\u093e\u0907\u091f \u0911\u0928 \u0915\u0930\u094b","turn off the wall light"],"what_it_does":["On/off, colour and brightness by voice","Reacts to whatever is playing, and to Jarvis speaking","All the animation is worked out by Jarvis; the controller just displays it"],"wiring":[{"connects_to":"Strip 1 data in","pin":"GPIO18"},{"connects_to":"Strip 2 data in","pin":"GPIO19"},{"connects_to":"Shared ground with the strip power supply","pin":"GND"}]},{"action_count":8,"actions":[{"description":"Search YouTube Music and play a song, artist, or genre","id":"play"},{"description":"Play a shuffled mix of the user's liked songs from their connected YouTube Music account","id":"play_liked"},{"description":"Play one of the user's own YouTube Music playlists by name","id":"play_playlist"},{"description":"Go back to the previous song (or restart the current one if already at the first)","id":"previous"},{"description":"Pause the currently playing song","id":"pause"},{"description":"Resume playback after a pause","id":"resume"},{"description":"Skip to the next song","id":"skip"},{"description":"Stop playback entirely","id":"stop"}],"capabilities":["music.play"],"category":"media","credentials":[{"how":"Connect on the Music page. Without it YouTube blocks anonymous playback with a bot check.","name":"YouTube Music session (optional but recommended)"}],"description":"Searches YouTube Music and plays songs through the speaker, with pause/resume/skip/stop control -- like Alexa's music playback.","difficulty":"easy","firmware":null,"hardware":[],"has_store_meta":true,"id":"music","name":"Music","needs_account":true,"needs_hardware":false,"notes":"","package":"music-1.0.0.zip","package_bytes":14341,"requirements":["network"],"setup_steps":["Install it.","Connect YouTube Music on the Music page.","Say: 'play some music'."],"status":"stable","summary":"Streams from YouTube Music through mpv, with recently played tracks cached to disk so a vague request starts almost instantly -- and still works with no network.","tagline":"Play anything, by name or by mood","version":"1.0.0","voice_examples":["play Kesariya","play Kesariya by Arijit Singh","play some Arijit Singh songs","play some lofi music","play something upbeat","play music"],"what_it_does":["Play by song, artist or mood","Pause, resume, skip, previous, stop","Recently played tracks cached locally for instant, offline starts"],"wiring":[]},{"action_count":8,"actions":[{"description":"Get calendar events scheduled for today","id":"today"},{"description":"Get upcoming calendar events","id":"upcoming"},{"description":"Create a Google Calendar event","id":"create"},{"description":"Reschedule an existing Google Calendar event","id":"reschedule"},{"description":"Cancel or delete an existing Google Calendar event","id":"cancel"},{"description":"Get the next upcoming calendar event or meeting","id":"next_event"},{"description":"Get the calendar event immediately after the next event","id":"event_after_next"},{"description":"Tell how much time remains until the next calendar event","id":"time_until_next"}],"capabilities":["calendar.query"],"category":"productivity","credentials":[{"how":"Connect on the Gmail page -- the same connection covers Calendar.","name":"Google account"}],"description":"Reads and manages the connected user's Google Calendar events.","difficulty":"easy","firmware":null,"hardware":[],"has_store_meta":true,"id":"calendar","name":"Calendar","needs_account":true,"needs_hardware":false,"notes":"","package":"calendar-3.0.0.zip","package_bytes":11113,"requirements":["network","connected_google_account"],"setup_steps":["Connect your Google account.","Ask: 'what's on my calendar today?'"],"status":"stable","summary":"Reads what is on your calendar and books new events by voice, understanding times said in plain language.","tagline":"Your day, read out to you","version":"3.0.0","voice_examples":["what is on my calendar today","what do I have today","show my calendar today","check my calendar today","tell me my schedule today","what is my schedule today"],"what_it_does":["Tells you what is on today or any other day","Creates events from spoken times","Reschedules an existing event"],"wiring":[]},{"action_count":4,"actions":[{"description":"Get a broad daily update including calendar, unread email, and pending reminders","id":"update"},{"description":"Full spoken morning briefing: greeting, weather, unread email summary, today's reminders, and top news","id":"morning_brief"},{"description":"Get pending reminders and remaining calendar commitments","id":"pending"},{"description":"Get only overdue or still remaining items for the current day","id":"today_left"}],"capabilities":["briefing.query"],"category":"productivity","credentials":[{"how":"For the email portion. The rest works without it.","name":"Google account"},{"how":"Used to fetch headlines and compose the briefing.","name":"OpenAI API key"}],"description":"Builds intent-aware briefings from Gmail, Calendar, and pending reminders.","difficulty":"easy","firmware":null,"hardware":[],"has_store_meta":true,"id":"daily_briefing","name":"Daily Briefing","needs_account":true,"needs_hardware":false,"notes":"","package":"daily_briefing-3.0.0.zip","package_bytes":13568,"requirements":["network","connected_google_account","local_storage"],"setup_steps":["Install it.","Set the delivery time on the Briefing page.","Or just ask: 'good morning'."],"status":"stable","summary":"One short spoken briefing each morning -- weather, unread mail, today's reminders and top headlines -- delivered when you are actually in the room.","tagline":"A spoken morning brief","version":"3.0.0","voice_examples":["give me update","give me an update","brief me","give me my briefing","daily briefing","morning briefing"],"what_it_does":["Composes one natural briefing instead of four separate answers","Delivered at a time you choose","Waits until you are present"],"wiring":[]},{"action_count":6,"actions":[{"description":"Get the user's latest unread Gmail messages","id":"get_unread"},{"description":"Get the user's latest Gmail messages","id":"get_latest"},{"description":"Search Gmail using a natural Gmail search query","id":"search"},{"description":"Read a specific Gmail message by message id","id":"get_email"},{"description":"Tell the user who sent a specific Gmail message","id":"get_sender"},{"description":"Explain what a specific Gmail message is about","id":"summarize_email"}],"capabilities":["gmail.query"],"category":"productivity","credentials":[{"how":"Connect it on the Gmail page in your dashboard. Read-only access; nothing is sent on your behalf.","name":"Google account"}],"description":"Reads and searches the connected user's Gmail account using read-only Google OAuth access.","difficulty":"easy","firmware":null,"hardware":[],"has_store_meta":true,"id":"gmail","name":"Gmail","needs_account":true,"needs_hardware":false,"notes":"If you use your own Google Cloud project, publish the OAuth app. While it is in Testing mode Google expires the refresh token every 7 days and you will have to reconnect.","package":"gmail-1.3.0.zip","package_bytes":13406,"requirements":["network","connected_google_account"],"setup_steps":["Open the Gmail page in your dashboard.","Connect your Google account.","Ask: 'any new emails?'"],"status":"stable","summary":"Summarises unread mail out loud, grouped and readable rather than read line by line.","tagline":"Hear what is in your inbox, without opening it","version":"1.3.0","voice_examples":["do I have any unread emails","any unread emails","koi unread email hai","mere unread emails batao","unread mail check karo","\u0915\u094d\u092f\u093e \u0915\u094b\u0908 unread email \u0939\u0948"],"what_it_does":["Says how many unread messages you have and who they are from","Summarises them in natural speech","Reads a specific message on request"],"wiring":[]},{"action_count":8,"actions":[{"description":"Create a reminder for a specific future time or after a relative duration","id":"create"},{"description":"List pending reminders","id":"list"},{"description":"Reschedule an existing reminder to a new future time","id":"reschedule"},{"description":"Cancel a pending reminder by reminder id","id":"cancel"},{"description":"List pending reminders due today","id":"today"},{"description":"List pending reminders whose due time has already passed","id":"overdue"},{"description":"Get the next pending reminder","id":"next_reminder"},{"description":"Mark an existing reminder as completed","id":"complete"}],"capabilities":["reminder.manage"],"category":"productivity","credentials":[],"description":"Creates and manages persistent personal reminders that can surface proactively when due.","difficulty":"easy","firmware":null,"hardware":[],"has_store_meta":true,"id":"reminder","name":"Reminder","needs_account":false,"needs_hardware":false,"notes":"","package":"reminder-2.0.0.zip","package_bytes":12595,"requirements":["local_storage"],"setup_steps":["Install it.","Say: 'remind me to call the plumber at 6pm'."],"status":"stable","summary":"Set reminders in plain speech. Jarvis holds a due reminder until you are actually present rather than announcing it to an empty room.","tagline":"Reminders that wait until you are actually there","version":"2.0.0","voice_examples":["remind me in one minute to call Ankit","remind me in half an hour to check the backup","remind me in 10 minutes to call mom","remind me tomorrow to pay the electricity bill","remind me at 9 pm to take my medicine","set a reminder for 5 pm"],"what_it_does":["Set reminders from natural spoken times","Speaks them out loud when due","Holds a reminder until you are back in the room"],"wiring":[]},{"action_count":3,"actions":[{"description":"Stop listening for a while. Always temporary: pass the minutes Vishal asked for, or leave it out for the 30 minute default. Never treat this as permanent -- a muted mic cannot hear itself being turned back on.","id":"mute"},{"description":"Start listening again. Rarely reachable by voice, since a muted mic hears nothing -- mostly useful for confirming the mic is already on.","id":"unmute"},{"description":"Say whether the microphone is muted and how much longer it will stay that way.","id":"status"}],"capabilities":["system.microphone"],"category":"system","credentials":[],"description":"Mutes Jarvis's own listening for a while, for a private conversation. A muted microphone is never opened at all, so nothing can hear an unmute -- every mute therefore expires on its own, after the requested time or 30 minutes by default. Use this when the owner asks Jarvis to stop listening, not when he asks it to be quiet or lower the volume (that is the speaker, a different thing).","difficulty":"easy","firmware":null,"hardware":[],"has_store_meta":true,"id":"mic_control","name":"Microphone","needs_account":false,"needs_hardware":false,"notes":"There is deliberately no voice unmute. While muted the microphone is never opened at all, so a voice unmute would mean keeping it live and transcribing the private conversation the mute exists to protect.","package":"mic_control-1.0.0.zip","package_bytes":4355,"requirements":[],"setup_steps":["Install it.","Say: 'mute the mic' or 'das minute ke liye mute karo'."],"status":"stable","summary":"Mute the microphone by voice for a private conversation. Every mute expires on its own -- a muted mic is never opened, so nothing could ever hear you ask for it back.","tagline":"Tell it to stop listening","version":"1.0.0","voice_examples":["mute the mic","stop listening","mic band kar do","sunna band karo","mute for 10 minutes","das minute ke liye mic band kar do"],"what_it_does":["Mute by voice, instantly and with no API call","Mute for a stated length ('mute for 10 minutes')","Always expires, so a forgotten mute can never leave Jarvis deaf"],"wiring":[]},{"action_count":2,"actions":[{"description":"Record a problem with Jarvis's own behaviour against the turn that just happened, so the nightly review can investigate and propose a fix. Always attaches to the previous turn automatically -- no need to identify it.","id":"log_issue"},{"description":"Say how many issues are currently reported and waiting to be looked at, and what the most recent ones were.","id":"list_issues"}],"capabilities":["system.self_report"],"category":"system","credentials":[],"description":"Lets the owner report a problem with Jarvis out loud, in the moment it happens ('that was wrong', 'yeh galat hua', 'log this issue'). The report is attached to the turn that just finished and queued for the nightly review to investigate and fix. Use this whenever he is complaining about Jarvis's own behaviour -- a wrong answer, a wrong action, something too slow, something it should have done and didn't. Do NOT use it for problems with the world (a light bulb being fused, the internet being down) -- only for Jarvis itself.","difficulty":"easy","firmware":null,"hardware":[],"has_store_meta":true,"id":"issue_report","name":"Report an Issue","needs_account":false,"needs_hardware":false,"notes":"","package":"issue_report-1.0.0.zip","package_bytes":5102,"requirements":[],"setup_steps":["Install it.","When something goes wrong, say: 'that was wrong' or 'ye galat hua'."],"status":"stable","summary":"Say 'that was wrong' mid-conversation and it is written down against the turn that just happened, with that turn's full evidence attached, ready for the next review.","tagline":"Say when it gets something wrong","version":"1.0.0","voice_examples":["log this issue","that was wrong","ye galat hua","yeh galat hai, issue log kar do","you turned on the wrong light, log it","that took too long, log this issue"],"what_it_does":["Report a problem out loud, in the moment","Attaches automatically to the turn you are complaining about","Lists what is still open"],"wiring":[]},{"action_count":2,"actions":[{"description":"Say how many people have joined the waitlist in total, and who the most recent ones were.","id":"summary"},{"description":"Describe the most recent signup in a little more detail, including where they are and what they said they would use it for.","id":"latest"}],"capabilities":["business.waitlist"],"category":"system","credentials":[],"description":"Reports who has signed up on the public website asking to buy a unit. Use this when the owner asks about signups, the waitlist, orders, interest, or how many people want one. Not for reminders, shopping lists or anything else called a list.","difficulty":"easy","firmware":null,"hardware":[],"has_store_meta":true,"id":"waitlist","name":"Waitlist","needs_account":false,"needs_hardware":false,"notes":"","package":"waitlist-1.0.0.zip","package_bytes":3316,"requirements":["local_storage"],"setup_steps":["Install it.","Ask: 'check the waitlist'."],"status":"stable","summary":"Watches the signups coming in from your public site and tells you out loud when someone new joins -- waiting until you are actually in the room to say it.","tagline":"Know the moment someone wants one","version":"1.0.0","voice_examples":["how many signups do we have","check the waitlist","kitne log waitlist pe hain","any new signups","who joined recently","\u0935\u0947\u091f\u0932\u093f\u0938\u094d\u091f \u091a\u0947\u0915 \u0915\u0930\u094b"],"what_it_does":["Says who just signed up, and where they are","Waits until you are in the room rather than announcing it to an empty house","Answers 'how many signups do we have' any time you ask"],"wiring":[]}]}
