{"actions":{"bootstrapAndRun":{"effect":"installs rote if missing, inspects, prepares, and asks before running","href":"https://play.modiqo.ai/install?play=rajkaria/birthday-radar@0.1.0","method":"GET","rel":"https://rote.dev/rels/bootstrap-and-run","requiresConsent":true,"responseMediaType":"text/x-shellscript"},"inspect":{"command":"rote play inspect https://play.modiqo.ai/rajkaria/birthday-radar@0.1.0","effect":"read-only"},"installCliOnly":{"effect":"installs the rote CLI, nothing else","href":"https://play.modiqo.ai/install","method":"GET","rel":"https://rote.dev/rels/install-cli","requiresConsent":true,"responseMediaType":"text/x-shellscript"},"run":{"command":"rote play run https://play.modiqo.ai/rajkaria/birthday-radar@0.1.0","effect":"executes the play locally after consent","headless":{"approvalAssertion":"--yes","approvalRequiredBeforeInvocation":true,"commandTemplate":"rote play run https://play.modiqo.ai/rajkaria/birthday-radar@0.1.0 <name=value...> --yes","stdinPolicy":"never pipe input to automate the interactive Ready selector"},"requiresConsent":true}},"description":"Your address book already knows every birthday in it. It mentions them on the morning of, which is the one moment the information is useless. This reads the book you already have and sorts it by how soon, so the next one is a number of days rather than a surprise. Three sources, any of which is enough. The macOS Contacts database is copied and reopened read-only, so the live database is never locked, journalled or upgraded by being looked at; when macOS refuses the read the Play says exactly that and names Full Disk Access as the fix rather than reporting an empty address book. Any folder of vCard files works, which is what every contacts app on every platform exports. So does a CSV export from Google Contacts or Outlook, with the columns matched by name. You get the next birthdays with the weekday and the age each person is turning, today's if there are any, and then the part a contact list never tells you: how much of the book has no birthday at all, how many birthdays carry no year so no age can be shown,","distribution":{"digest":"sha256:cb3e8a455d34052e4a7613719ab0c64ec59c00ef8bb1c6c669f8f4593abd13e4","mediaType":"application/vnd.modiqo.rote-flow","size":65925,"verifiedBy":"rote verifies the downloaded archive against this digest before it runs"},"effects":{"credentialsProvidedBy":"runner","credentialsRemainLocal":true,"declaredWrites":[],"publisherReceivesCredentials":false},"id":"https://play.modiqo.ai/rajkaria/birthday-radar@0.1.0","inputPolicy":{"omittedValues":"inspect_full_parameters_before_collecting_values_or_consent","optionalWithDefault":"show_default_and_accept_override","optionalWithoutDefault":"omit_unless_supplied","required":"ask","secrets":"collect_locally_outside_conversation"},"links":{"docs":"https://rote.dev","page":"https://play.modiqo.ai/rajkaria/birthday-radar@0.1.0","protocol":"https://play.modiqo.ai/.well-known/rote","self":"https://play.modiqo.ai/rajkaria/birthday-radar@0.1.0.json"},"name":"birthday-radar","owner":{"kind":"user","slug":"rajkaria"},"parameters":[{"default":"~/daily","description":"Created if missing. Everything this Play writes goes here and nowhere else.","example":"~/daily","input":{"allowCustom":true,"choices":[],"label":"Out dir"},"name":"out_dir","required":false,"type":"string"},{"default":"false","description":"true runs against a bundled synthetic address book, so a first run needs nothing exported.","example":"false","input":{"allowCustom":true,"choices":[],"label":"Demo"},"name":"demo","required":false,"type":"string"},{"default":45,"description":"How far ahead to look for the next birthdays.","example":45,"input":{"allowCustom":true,"choices":[],"label":"Horizon"},"name":"horizon","required":false,"type":"integer"},{"default":"~/Documents","description":"A folder of .vcf exports, or one .vcf file. Searched recursively.","example":"~/Documents","input":{"allowCustom":true,"choices":[],"label":"Vcard dir"},"name":"vcard_dir","required":false,"type":"string"},{"default":"","description":"Optional path to a Google or Outlook contacts CSV. Columns are matched by name.","example":"","input":{"allowCustom":true,"choices":[],"label":"Csv path"},"name":"csv_path","required":false,"type":"string"},{"default":"true","description":"true prints A. L. instead of the full name. Set false for a private run on your own machine.","example":"true","input":{"allowCustom":true,"choices":[],"label":"Redact"},"name":"redact","required":false,"type":"string"}],"preparation":[{"action":{"command":"rote play inspect https://play.modiqo.ai/rajkaria/birthday-radar@0.1.0 --json","effect":"read-only"},"step":1,"type":"inspect_local_readiness"},{"references":["/parameters"],"step":2,"type":"collect_parameters","whenValuesOmitted":"Run step 1 before collecting inputs or showing defaults; omittedFields are unknown values, not absent defaults or exhaustive choices."},{"references":["/parameters","/requirements","/effects"],"step":3,"type":"review"},{"consentBoundary":"the user approves the exact play and parameter values","references":["/parameters","/requirements","/effects"],"step":4,"type":"obtain_run_consent"},{"action":{"command":"rote play run https://play.modiqo.ai/rajkaria/birthday-radar@0.1.0","headlessCommandTemplate":"rote play run https://play.modiqo.ai/rajkaria/birthday-radar@0.1.0 <name=value...> --yes"},"preservesAcquisitionBoundaries":["adapter_selection","oauth_dcr","google_discovery","static_token_setup","runtime_security_checks"],"requiresConsent":true,"step":5,"type":"run"}],"producedBy":{"roteVersion":"0.79.0"},"publishedAt":"2026-09-05T16:43:41.335045+00:00","reference":"rajkaria/birthday-radar@0.1.0","requested":"rajkaria/birthday-radar","requirements":{"adapters":[],"browser":{"dependencies":[],"runtime":false,"signIn":false},"hostToolRequirements":[{"command":"python3","required":true,"versionRequirement":null}],"localTools":["python3"],"roteCli":{"minimumVersion":"0.91.0"},"sessions":false},"resolution":"latest","schema":"rote.play.v1","stats":{"downloads":1,"installs":0},"steps":{"count":4,"names":["read_contacts","read_csv","read_vcards","report"]},"title":"birthday-radar","type":"play","version":"0.1.0","visibility":"public"}