hERALD

# hERALD [![Listed on OpenMacApps](https://openmacapps.com/badge.svg)](https://openmacapps.com/apps/herald/) [![Latest release](https://img.shields.io/github/v/release/starbudweiser/hERALD)](https://github.com/starbudweiser/hERALD/releases/latest) [![License: MIT](https://img.shields.io/badge/license-MIT-blue)](LICENSE) **Communication campaign management for modders — hERALD never publishes anything itself.** 🇬🇧 English · đŸ‡«đŸ‡· [Français](#français) ## About **hERALD** is a free, open-source macOS app (MIT License) by starbudweiser, written with the help of Claude Code (Anthropic). It plans communication campaigns for modders: it prepares texts, tracks posts and outreach, and never publishes anything itself. Use *About hERALD* in the app menu for the version and credits. Updates are found automatically in this repository's releases (signature checked, installed only when nothing is running; can be switched off in Settings). ## Features **Golden rule:** hERALD prepares and tracks. It never publishes: you copy the text and post it yourself. It only sends an outreach email when you click *Send*, after a confirmation, through your Mail app. - **Window**: sidebar panel (campaign picker, Today, Calendar, Posts, Contacts, Statistics, Feedback, Monitoring, Channels, AI agent, Browser; ⌘1–⌘9), view header with search (⌘F), status bar. Default 1280 × 800. - **Today**: key figures (views +24 h, interactions, downloads, next milestone) and a to-do list: posts due or late, published posts without a link, unread replies, due follow-ups. - **Posts**: tracking and drafts in one list (filter by status and channel) with a tabbed inspector: Text (FR/EN/ES/IT, Copy), Numbers, Feedback, Notes; link after publishing and *Mark published*. - **Contacts (outreach)**: YouTubers, press, sites, Discord
 with status, next follow-up, coverage link, message thread and a mail editor (first-contact and follow-up templates in the contact's language). *Send* goes through the mail client chosen in Settings: the **Mail app** (AppleScript: no password handled; send, read the replies of your contacts' addresses, move them to Mail's Trash) or **another client** (opens a ready-to-send message). Always on your click, after a confirmation. Plans from before the redesign are migrated once. - **Browser**: built-in web view (tabs, persistent cookies, no password autofill). Every link of the app opens there; ⌄-click or the button opens the Mac's browser. - **Publishing workspace** (⌘⇧B, or “Publish in the browser”): the browser on the channel's compose page on the left, a fixed panel on the right with the FR/EN/ES/IT texts (editable, one Copy button each, character limits for Bluesky and X), links and hashtags, the post-publication link (“Use the page address”) and “Mark published”; “Next” moves to the next post of the day, Esc closes. hERALD still never publishes: you paste and post yourself. - **Assist mode** (agent panel → “Take control”): the AI agent can drive the browser, write and send emails, edit the plan, with a visible banner, a Stop button, and your confirmation before anything irreversible (optional full autonomy). Passwords, payments and CAPTCHAs always stay yours. - **Automatic updates**: once a day hERALD looks for a newer release on GitHub, checks the Developer ID signature, replaces itself and relaunches (never while a reading or the AI agent is working). *Settings → Updates*: tick box and *Check for updates* button. - **iCloud backup of your plans**: a snapshot per day (30 kept) plus `plan-latest.herald` in *iCloud Drive â€ș hERALD â€ș Sauvegardes*, 20 s after each change. An empty plan is never saved. *Settings → iCloud backup*: on/off, *Back up now*, *Restore
* (the current plan is kept as `plan_avant_restauration.json`). - **Plan**: campaigns with an event date and countdown, dated milestones (teaser, D-day announcement, follow-up), posts per channel (Nexus, Reddit, Discord, YouTube, GitHub, X/Bluesky, Instagram, forums) with status *idea → draft → approved → published* and link. Month calendar and tracking table. - **Drafts** per post in French, English, Spanish and Italian, copied in one click. - **Monitoring**: watch GitHub releases and Nexus mod pages (read only, public APIs; the optional Nexus API key stays in the macOS keychain). Checked automatically once a week at launch; weekly report readable in the app and copyable as Markdown. - **Statistics**: one panel for everything published in the campaign. Views, likes, comments, shares and downloads read from each post's link (YouTube with a free API key, Reddit, Bluesky, GitHub, Nexus) and site visits (GoatCounter, free, no cookies); Instagram, Facebook, Discord or X are entered by hand. Hourly readings during a campaign, daily otherwise, in the background. Key figures, cumulative curve per platform with milestones, 24 h / 7 days / whole campaign, best performer, posts published without a link, Markdown report. - **App icon**: Dock, menu bar (colour icon at the top of the screen) or both, in Settings. With the menu bar, closing the window keeps hERALD running (readings continue) and a click on the icon reopens it. - **Feedback**: record comments, downloads, endorsements, stars or views per post, or import a CSV `date;type;value;text` (`2026-11-11;comment;3;Nice`). - Local data in `~/Library/Application Support/hERALD/plan.json`; export/import of the whole plan (keys never included). - Optional example campaign (a fictional mod launch with milestones, channels and placeholder drafts), offered at first launch and deletable; *Plan → Add the example campaign* brings it back. - Plans are saved and shared as `.herald` files (JSON). - **Drop box**: JSON files dropped in a watched folder are merged automatically (see below). - Zoom the whole interface with ⌄+ / ⌄− (⌄0 for actual size), from 70 % to 200 %. - Interface in English, French, Spanish and Italian (follows your Mac's language, English otherwise). macOS 14+. ### ✹ Talk to your AI agent, from inside your plan (optional) Switch it on in *Settings → AI agent* and every task of your plan gets a chat with the agent of your choice: **Claude Code**, **Codex or any command-line agent**, or **ChatGPT / any OpenAI-compatible API**. hERALD works exactly the same without it: it is off by default, and nothing changes for you if you never use it. **Why it is worth it if you run a local AI agent** (Claude Code on your Mac, for instance): - **One home for everything.** Every request lands in a single, named Claude Code session ("hERALD"). Open Claude Code later and the whole conversation is there: ask in hERALD, continue in Claude Code, or the other way round. - **The agent finds the task by itself.** hERALD sends the task sheet (title, date, channel, status, notes, link, drafts, statistics) with your question, plus the plan and the campaign notes whenever they changed. "Rewrite this one for Reddit" is enough. - **It knows your files.** A local agent can read the folder you give it: videos, scripts, press kit, notes. It checks facts instead of guessing them. - **Sub-sessions for big jobs.** The agent can open a sub-session for a long piece of work (translate everything, prepare a press kit) and hERALD links it to the task, so you can resume it later. - **You stay in charge.** The agent reads and advises. Its proposed changes (notes, drafts in four languages, status) appear as a card with a preview: one click applies them, one click undoes them. It can never mark a post "published" and never publishes anything. - **Made for your campaign.** Write instructions once (tone, audience, constraints), edit the quick actions (write the draft, improve the hook, translate, check before publishing), choose what is shared: drafts, statistics, campaign notes. - **Private and cheap.** Everything stays on your Mac, sent only to the agent you chose. With Claude Code, a light mode (on by default) starts it without your MCP servers, skills and hooks: a request costs about a hundred times fewer tokens. Details, setup and tips: [docs/AI_AGENT.md](docs/AI_AGENT.md). ### Drop box (automation) hERALD watches `~/Library/Application Support/hERALD/Inbox`. Every `.json` file dropped there (a change file, or a whole `.herald` plan) is merged into the plan at once, then moved to `processed/` or `errors/`; each change is logged in `journal.log` (also visible in Settings). Merge is careful: an existing item (same `id`, else same title and same day, or same name) only gets its empty fields filled — use `"overwrite": true` to replace. All or nothing: one error and nothing is applied. hERALD still never publishes anything (contacts are merged too: `"contacts": [...]`, by name). `tools/herald_add` (python3, no dependency) writes these files for you, so a script or an AI assistant can feed hERALD: ```bash tools/herald_add post --title "Launch" --date 2026-11-11 --channel reddit --status draft --draft en="Hello
" --draft-file fr=launch_fr.md tools/herald_add milestone --title "D-day" --date 2026-11-11 --kind announce tools/herald_add watch https://github.com/owner/repo --name "My tool" tools/herald_add feedback --post "Launch" --date 2026-11-12 --kind downloads --value 120 tools/herald_add json changes.json # or a .herald plan; "-" reads stdin tools/herald_add schema # JSON Schema of the format ``` Change file format ([full JSON Schema](docs/herald-changes.schema.json)): ```json { "format": "herald-changes", "campaign": "My campaign", "channels": [{"name": "r/macgaming", "kind": "reddit", "url": "https://www.reddit.com/r/macgaming"}], "watch": [{"url": "https://github.com/owner/repo", "name": "My tool"}], "milestones": [{"title": "Teaser", "date": "2026-11-04", "kind": "teaser"}], "posts": [{ "title": "Launch post", "date": "2026-11-11 18:00", "channel": "r/macgaming", "milestone": "Teaser", "status": "draft", "link": "", "notes": "", "drafts": {"fr": "
", "en": "
", "es": "
", "it": "
"}, "feedback": [{"date": "2026-11-12", "kind": "comment", "value": 3, "text": "Nice"}] }], "feedback": [{"post": "Launch post", "date": "2026-11-13", "kind": "downloads", "value": 250}] } ``` `campaign` (id or name, created if missing; default: the campaign on screen), `channel` (id, name or kind), `milestone` (id or title). Dates: `YYYY-MM-DD` (noon), `YYYY-MM-DD HH:MM` (local time) or ISO 8601. Status: `idea`, `draft`, `approved`, `published`. Feedback kinds: `comment`, `downloads`, `endorsements`, `stars`, `views`, `other`. ## Install **[Download the latest notarized release](https://github.com/starbudweiser/hERALD/releases/latest)**, unzip it and move hERALD to your Applications folder. Requires **macOS 14 Sonoma** or later. ## Build Build: `./build_app.sh` · tests: `tests/run_tests.sh` ## Languages English, French, Spanish and Italian. The app follows your Mac's preferred language automatically (English if it is none of these four). ## Support 💬 Help and community: [Skyrim Mac Toolkit Discord](https://discord.gg/jRS4rvynx6) · bug reports: [GitHub Issues](https://github.com/starbudweiser/hERALD/issues). ## License Released under the **MIT License**. See [LICENSE](LICENSE). --- ## Français **Gestion de campagne de communication pour moddeurs — hERALD ne publie jamais rien lui-mĂȘme.** 💬 Aide et communautĂ© : [Discord du Skyrim Mac Toolkit](https://discord.gg/jRS4rvynx6) **RĂšgle d'or :** hERALD prĂ©pare et suit. Il ne publie jamais : vous copiez le texte et publiez vous-mĂȘme. Il n'envoie un e-mail de dĂ©marchage que sur votre clic sur *Envoyer*, aprĂšs confirmation, par votre app Mail. ### ✹ Discutez avec votre agent IA, depuis votre plan (facultatif) Activez-le dans *RĂ©glages → Agent IA* : chaque tĂąche de votre plan a une discussion avec l'agent de votre choix, **Claude Code**, **Codex ou tout agent en ligne de commande**, ou **ChatGPT / toute API compatible OpenAI**. hERALD fonctionne exactement pareil sans lui : il est dĂ©sactivĂ© par dĂ©faut, et rien ne change si vous ne l'utilisez jamais. **Pourquoi c'est prĂ©cieux si vous avez un agent IA local** (Claude Code sur votre Mac, par exemple) : - **Un seul endroit pour tout.** Chaque demande arrive dans une seule session Claude Code nommĂ©e (« hERALD »). Rouvrez Claude Code plus tard : toute la conversation y est. Demandez dans hERALD, poursuivez dans Claude Code, ou l'inverse. - **L'agent retrouve la tĂąche tout seul.** hERALD joint Ă  votre question la fiche de la tĂąche (titre, date, canal, statut, notes, lien, brouillons, statistiques), plus le plan et les notes de campagne quand ils ont changĂ©. « Réécris celle-ci pour Reddit » suffit. - **Il connaĂźt vos fichiers.** Un agent local peut lire le dossier que vous lui donnez : vidĂ©os, scripts, dossier de presse, notes. Il vĂ©rifie les faits au lieu de les deviner. - **Des sous-sessions pour les gros travaux.** L'agent peut ouvrir une sous-session pour un long travail (tout traduire, prĂ©parer un dossier de presse) ; hERALD la rattache Ă  la tĂąche pour que vous puissiez la reprendre. - **Vous gardez la main.** L'agent lit et conseille. Ses propositions de modifications (notes, brouillons en quatre langues, statut) s'affichent dans une carte avec aperçu : un clic les applique, un clic les annule. Il ne peut jamais marquer une publication « publiĂ©e » et ne publie rien. - **AdaptĂ© Ă  votre campagne.** Écrivez une fois des consignes (ton, public, contraintes), modifiez les actions rapides (rĂ©diger, amĂ©liorer l'accroche, traduire, vĂ©rifier avant publication), choisissez ce qui est partagĂ© : brouillons, statistiques, notes de campagne. - **PrivĂ© et Ă©conome.** Tout reste sur votre Mac, envoyĂ© seulement Ă  l'agent choisi. Avec Claude Code, un mode lĂ©ger (activĂ© par dĂ©faut) le dĂ©marre sans vos serveurs MCP, skills et hooks : une demande consomme environ cent fois moins de jetons. DĂ©tails, rĂ©glages et astuces : [docs/AGENT_IA.md](docs/AGENT_IA.md). - **FenĂȘtre** : barre latĂ©rale en panneau (sĂ©lecteur de campagne, Aujourd'hui, Calendrier, Publications, Contacts, Statistiques, Retours, Veille, Canaux, Agent IA, Navigateur ; ⌘1–⌘9), en-tĂȘte de vue avec recherche (⌘F), barre d'Ă©tat. 1280 × 800 par dĂ©faut. - **Aujourd'hui** : chiffres clĂ©s (vues +24 h, interactions, tĂ©lĂ©chargements, prochain jalon) et liste « À faire » : publications du jour ou en retard, publiĂ©es sans lien, rĂ©ponses non lues, relances dues. - **Publications** : suivi et brouillons dans une seule liste (filtre par statut et canal) avec un inspecteur Ă  onglets : Texte (FR/EN/ES/IT, Copier), Chiffres, Retours, Notes ; lien aprĂšs publication et *Marquer publiĂ©*. - **Contacts (dĂ©marchage)** : youtubeurs, presse, sites, Discord
 avec statut, prochaine relance, lien obtenu, fil des messages et Ă©diteur de mail (modĂšles premier contact et relance dans la langue du contact). *Envoyer* passe par le client de messagerie choisi dans les RĂ©glages : l'**app Mail** (AppleScript : aucun mot de passe manipulĂ© ; envoi, lecture des rĂ©ponses des adresses de vos contacts, mise Ă  la corbeille de Mail) ou **un autre client** (ouvre un message prĂȘt Ă  envoyer). Toujours sur votre clic, aprĂšs confirmation. Les plans d'avant la refonte sont migrĂ©s une fois. - **Navigateur** : vue web intĂ©grĂ©e (onglets, cookies conservĂ©s, pas de saisie automatique de mots de passe). Tous les liens de l'appli s'y ouvrent ; ⌄-clic ou le bouton ouvre le navigateur du Mac. - **Espace de publication** (⌘⇧B, ou « Publier dans le navigateur ») : le navigateur sur la page de rĂ©daction du canal Ă  gauche, un panneau fixe Ă  droite avec les textes FR/EN/ES/IT (modifiables, un bouton Copier chacun, limites de caractĂšres Bluesky et X), les liens et hashtags, le lien aprĂšs publication (« Prendre l'adresse de la page ») et « Marquer publiĂ© » ; « Suivant » passe Ă  la publication suivante du jour, Échap ferme. hERALD ne publie toujours jamais : vous collez et publiez vous-mĂȘme. - **Mode assistance** (panneau de l'agent → « Donner la main ») : l'agent IA peut piloter le navigateur, rĂ©diger et envoyer des mails, modifier le plan, avec un bandeau visible, un bouton Stop et votre confirmation avant toute action irrĂ©versible (autonomie complĂšte en option). Mots de passe, paiements et CAPTCHA restent toujours pour vous. - **Mises Ă  jour automatiques** : une fois par jour, hERALD cherche une version plus rĂ©cente dans les releases GitHub, vĂ©rifie la signature Developer ID, se remplace et se relance (jamais pendant un relevĂ© ou un travail de l'agent). *RĂ©glages → Mises Ă  jour* : case Ă  cocher et bouton *Rechercher une mise Ă  jour*. - **Sauvegarde iCloud des plans** : un instantanĂ© par jour (30 gardĂ©s) et `plan-latest.herald` dans *iCloud Drive â€ș hERALD â€ș Sauvegardes*, 20 s aprĂšs chaque modification. Un plan vide n'est jamais sauvegardĂ©. *RĂ©glages → Sauvegarde iCloud* : activer, *Sauvegarder maintenant*, *Restaurer
* (le plan actuel est gardĂ© dans `plan_avant_restauration.json`). - **Plan** : campagnes avec date d'Ă©vĂ©nement et compte Ă  rebours, jalons datĂ©s (teaser, annonce du Jour J, suivi), publications par canal avec statut *idĂ©e → brouillon → validĂ© → publiĂ©* et lien. Calendrier du mois et tableau de suivi. - **Brouillons** par publication en français, anglais, espagnol et italien, copiĂ©s en un clic. - **Veille** : versions GitHub et pages de mods Nexus (lecture seule, API publiques ; la clĂ© API Nexus facultative reste dans le trousseau macOS). VĂ©rification automatique une fois par semaine au lancement ; rapport hebdomadaire lisible dans l'appli et copiable en Markdown. - **Statistiques** : un seul panneau pour tout ce qui a Ă©tĂ© diffusĂ© dans la campagne. Vues, j'aime, commentaires, partages et tĂ©lĂ©chargements lus depuis le lien de chaque publication (YouTube avec une clĂ© API gratuite, Reddit, Bluesky, GitHub, Nexus) et visites du site (GoatCounter, gratuit, sans cookies) ; Instagram, Facebook, Discord ou X se saisissent Ă  la main. Un relevĂ© par heure pendant une campagne, un par jour sinon, en arriĂšre-plan. Chiffres clĂ©s, courbe cumulĂ©e par plateforme avec les jalons, 24 h / 7 jours / toute la campagne, publication la plus en forme, publications sans lien, rapport Markdown. - **IcĂŽne de l'appli** : Dock, barre de menus (silhouette en couleur en haut de l'Ă©cran) ou les deux, dans les RĂ©glages. Avec la barre de menus, fermer la fenĂȘtre laisse hERALD tourner (les relevĂ©s continuent) et un clic sur l'icĂŽne la rouvre. - **Retours** : commentaires, tĂ©lĂ©chargements, endorsements, Ă©toiles ou vues par publication, saisis Ă  la main ou importĂ©s d'un CSV `date;type;valeur;texte`. - DonnĂ©es locales dans `~/Library/Application Support/hERALD/plan.json` ; export/import du plan complet (sans aucune clĂ©). - Campagne d'exemple facultative (lancement fictif d'un mod : jalons, canaux, brouillons Ă  complĂ©ter), proposĂ©e au premier lancement et supprimable ; *Plan → Ajouter la campagne d'exemple* la recrĂ©e. - Les plans s'enregistrent et s'Ă©changent en fichiers `.herald` (JSON). - **BoĂźte de dĂ©pĂŽt** : des fichiers JSON dĂ©posĂ©s dans un dossier surveillĂ© sont fusionnĂ©s automatiquement (voir plus bas). - Zoom de toute l'interface avec ⌄+ / ⌄− (⌄0 pour la taille normale), de 70 % Ă  200 %. - Interface en français, anglais, espagnol et italien (langue du Mac, anglais sinon). macOS 14+. ### BoĂźte de dĂ©pĂŽt (automatisation) hERALD surveille `~/Library/Application Support/hERALD/Inbox`. Chaque fichier `.json` dĂ©posĂ© (fichier de changements, ou plan `.herald` complet) est fusionnĂ© aussitĂŽt dans le plan, puis rangĂ© dans `processed/` ou `errors/` ; chaque changement est notĂ© dans `journal.log` (visible aussi dans les RĂ©glages). Fusion prudente : un Ă©lĂ©ment existant (mĂȘme `id`, sinon mĂȘme titre et mĂȘme jour, ou mĂȘme nom) voit seulement ses champs vides complĂ©tĂ©s — `"overwrite": true` pour remplacer. Tout ou rien : une erreur et rien n'est appliquĂ©. hERALD ne publie toujours rien. `tools/herald_add` (python3, sans dĂ©pendance) Ă©crit ces fichiers pour vous, pour qu'un script ou un assistant IA alimente hERALD : voir les exemples et le format ci-dessus ([schĂ©ma JSON](docs/herald-changes.schema.json)). Compilation : `./build_app.sh` · tests : `tests/run_tests.sh` MIT License.