個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證Turns RSS feeds into numbered text lines and JPG images for TV tickers and playout graphics. By OnAir Garage.
翻譯準備中
取自儲存庫 README
正在載入完整 README。 以下為已儲存的摘錄。
Downloads RSS feeds on a schedule and turns each one into numbered text lines and JPG images for TV tickers and playout graphics. Free desktop app (Electron) from OnAir Garage.
• Tool page: https://onairgarage.com/tools/ticker-feed-builder/
• Author: Graziano Melzi · OnAir Garage — [email protected]
• License: MIT (see LICENSE)
• Systems: Windows (installer), macOS (dmg, Apple silicon and Intel), Linux (AppImage, x64). Built for all three; only macOS has been run so far (see Validation).檢視完整 README ↗Downloads RSS feeds on a schedule and turns each one into numbered text lines and JPG images for TV tickers and playout graphics. Free desktop app (Electron) from OnAir Garage.
LICENSE)Ticker-Feed-Builder-Manual-EN-<version>.pdf), Italian (-IT-) and Spanish (-ES-); the source is in docs/manual/ (python3 docs/manual/build.py <version> <folder> makes the PDFs; it needs Chrome or Chromium).Screenshots use invented demo feeds, taken from the real app (version 26.10.9, running on Linux; dark and light themes).
It replaces the rss_ticker_downloader.py scripts that fed NeMedia Morpheus from Windows Task Scheduler. The app lives in the tray, runs 24/7 and, for every feed of every profile, writes:
| File | Content |
|---|---|
<Name>_Title.Txt | one headline per line |
<Name>_Description.Txt | one description per line, same order |
<Name>/00001.JPG, 00002.JPG… | one JPG per story, same order |
<Name>_metadata.json | counters of the last run (optional) |
- (configurable); a missing or unreadable image becomes the placeholder image.{folder}), image number start/digits/extension, JPEG quality, optional resize (fill or fit), title/description length limits.ETag / Last-Modified; answer 304 = nothing is downloaded). If the server cannot say, the feed is downloaded and its content compared with the previous copy (same content = no image download, no file touched). Images are downloaded and files written only when something is new; a failed image is retried at the next check, and a deleted output file or an edited setting triggers a rebuild. "Run now" always rebuilds everything.The default layout is the one the original scripts produced for NeMedia Morpheus. It has not been checked against NeMedia documentation (none was read); other ticker systems may need other names, encodings or sizes, which is why everything is configurable.
A feed that is free to download is not necessarily free to broadcast. Publishers usually offer RSS for personal reading; showing their headlines publicly on TV, screens or websites normally needs an agreement with the publisher. That responsibility is the user's; this is not legal advice. The app ships without any feed; the examples below come from the pages read on 8 October 2026 (paraphrased; the pages carry no version or date, so read the current text before relying on it).
| Publisher | What its RSS page says | Page |
|---|---|---|
| ANSA | Non-commercial use by individuals and non-profit organisations, only to view the feeds in RSS reader programs; using them to publish the latest headlines on websites or blogs is not allowed; any other use must be requested and expressly authorised. | https://www.ansa.it/sito/static/ansa_rss.html |
| Adnkronos | Non-commercial use by individuals and non-profit organisations; the feeds may not be made public (websites, blogs, outdoor communication systems, any other means that spreads the news publicly) without a prior agreement with Adnkronos. | https://www.adnkronos.com/rss |
Both pages list their feeds by section (politics, foreign news, sport…); use them as examples of what to ask for in an agreement.
No measurements or standards-based formulas. The external rules used:
| Value / rule | Source | Status |
|---|---|---|
RSS 2.0 item fields (title, description, enclosure), Atom entry, Media RSS media:content / media:thumbnail | feed formats as found in the feeds themselves (Adnkronos, ANSA); no specification was read for this release | recommended (practice, not verified against the specifications) |
Characters not allowed in a file name, reserved names (CON, PRN, NUL, COM1…) | Microsoft Learn, Naming Files, Paths, and Namespaces — same rules as in File Renamer | official (read in the File Renamer project, not re-read for this release) |
| Default output layout and file names | original scripts v3.2 supplied by the author | reference implementation |
Telegram sendMessage | Telegram Bot API | not re-read for this release |
| SMTP submission (STARTTLS / TLS), Bcc | nodemailer library defaults; no RFC read for this release | recommended (practice) |
| Terms of use of the ANSA and Adnkronos RSS feeds | the two RSS pages above | official (read 2026-10-08, summarised) |
Results as of October 2026.
| Reference | What it validates | Result | How to re-run |
|---|---|---|---|
| Automated tests (82) | text cleaning, text changes (replacements, capital letters, text before / after, own limits), the ad-hoc signature hook, RSS/Atom parsing, line/image sync, empty values, orphan removal, unchanged files, change detection (304, same content, failed-image retry, deleted output, per-feed interval), WebP/AVIF decoding, time windows, filters, merged feeds, duplicates across feeds, file check, remembered state, frozen-feed alert, daily summary, headless CLI, failure keeps old files, missing folder not created, private image addresses, scheduler, alerts | pass | npm test |
| Original Python script v3.2 on 8 live feeds (2026-10-08, macOS; a one-off development check with the feeds the script used, not part of the app) | same titles and descriptions as the original for the same feeds | 14 of 16 text files byte-identical; the other 2 differ only because the feeds changed between the two runs (stories shifted by one); one title carried an invisible BOM character in the original, which the app removes | run both on the same feeds and compare (cmp) |
| Same run | number of images per feed | equal for all 8 feeds | same |
| End-to-end on the real Electron app (macOS; Linux for the 26.10.10 interface) | create profile, run, files on disk, status in the UI, language switch, Settings tabs, show / hide password, backup box, Help & About, feed options, no console errors | pass | node dev/e2e-electron.mjs [screenshotDir] |
Not validated: WebP/AVIF with real-world files from publishers (only synthetic images in the tests); the headless mode on Windows and as a service; playback in NeMedia Morpheus or any other ticker system; Linux on a real desktop; runs lasting days; Telegram and email delivery against real services (unit-tested with fakes; the email envelope is checked with the real Nodemailer message builder, not with a mail server); Windows-1252 output beyond a unit test. Opening the ad-hoc signed app on an Apple Silicon Mac (only the build job checks the signature; the author tries the preview by hand); a click on the tip jar opening the system browser on Windows and macOS; the text changes on a live ticker. This is not a certified tool.
| Document | Version read |
|---|---|
| RSS 2.0 specification, Atom (RFC 4287), Media RSS | not read for this release |
| Telegram Bot API | not read for this release |
| SMTP (RFC 5321 / 6409) | not read for this release |
| NeMedia Morpheus manual (expected file layout) | not read |
ANSA RSS page (ansa.it/sito/static/ansa_rss.html) | read 2026-10-08, no version or date on the page |
Adnkronos RSS page (adnkronos.com/rss) | read 2026-10-08, no version on the page |
npm install
npm start # the app
npm test # unit tests (Node 20+)
node dev/e2e-electron.mjs # end-to-end on the real app
npm run dist:mac # or dist:win / dist:linux
src/cli.js runs the same engine, schedules, filters, alerts (Telegram, email) and daily summary without a window or tray (no desktop notifications).
node src/cli.js --settings exported-settings.json --data ./tfb-data # runs until stopped (Ctrl+C)
node src/cli.js --settings exported-settings.json --data ./tfb-data --once # one run, then exit
The installed app can run it without Node.js: ELECTRON_RUN_AS_NODE=1 "<app executable>" "<resources>/app.asar/src/cli.js" --settings … --data … (the exact command for this computer is shown in Settings → Headless mode). --once exits with 0 (all feeds fine), 1 (some problem) or 2 (settings unusable). Use the file written by "Export settings"; it contains no secrets, so set TFB_TELEGRAM_TOKEN and TFB_SMTP_PASS in the environment. The file is read again every 30 seconds. On Windows start it with Task Scheduler at startup ("run whether the user is logged on or not"), on Linux with a systemd service, on macOS with launchd. Logs and the remembered state go to the --data folder.
main.js, preload.cjs — Electron main process and bridge.src/ — the engine, independent of Electron: engine.js (download → filter → convert → write → check), runtime.js (engine + scheduler + alerts + summary + remembered state, shared by the app and the headless mode), cli.js, feed.js, filters.js, schedule-rules.js, digest.js, text.js, image.js, image-modern.js, output.js, format.js, http.js, scheduler.js, notify.js, messages.js, settings.js, logger.js, updater.js, secrets.js (the one list of every secret) and backup.js (the backup file and its import). updater.js, secrets.js and backup.js start with // garage-common: <name> <version>: they are copies of modules shared by the OnAir Garage apps.renderer/ — the interface (strict CSP, no inline scripts or styles, no CDN, system fonts).assets/ — the logo as SVG (logo.svg app icon, tray.svg single-colour menu-bar glyph), the generated icons and the built-in placeholder. node dev/make-icons.mjs regenerates every icon from the two SVGs (needs Playwright with a Chromium; see the top of the script).dev/ — tests, end-to-end script, icon and placeholder generators.Versions are YY.M.N (e.g. 26.10.1), tags vYY.M.N.
fast-xml-parser (MIT), jimp (MIT), iconv-lite (MIT), nodemailer (MIT-0), @jsquash/webp and @jsquash/avif (Apache-2.0), Electron (MIT). No fonts are bundled.
src/cli.js): the same engine without a window, for a server or a machine that must update the ticker after a restart before anyone logs in. See "Headless mode" below.[Ticker Feed Builder · installation name] (Settings, General; default the computer name).SHA256SUMS.txt, start with the computer, keep-awake option.SHA256SUMS.txt. Close and install is refused while a profile is running, saves a safety copy of the settings first (last 3 kept) and starts the installer (Windows), opens the disk image (macOS) or shows the AppImage (Linux). A What's new window shows once after an update. Nothing installs without a click.ticker-feed-builder-backup-YYYY-MM-DD.json with profiles, feeds, formats and settings. The box Include passwords and tokens is off by default; ticked, the SMTP password, the Telegram token and feed credentials (user:password@) are written in plain text (red warning) and the file is created with mode 0600. Import replaces everything or adds only the missing profiles, keeps a password already on the computer when the mail server and user are the same, and lists what must be typed again. Alert state, check history, logs and window position are never in a backup.search → replace with, one per line, plain text, capital letters count), ALL CAPITALS / lowercase / only the first letter capital, a text before and/or after the title (e.g. ANSA – ), own title and description limits. Applied just before the length limits (order: replacements, capital letters, text before / after, length limit with "…" at the end of a word); the test dialog shows the result. Off by default; no regular expressions.xattr -cr "/Applications/Ticker Feed Builder.app" && codesign --force --deep -s - "/Applications/Ticker Feed Builder.app".