Signboard-Duo

Language / 言語: English | 日本語
English
Signboard-Duo is a VS Code extension that shows your RSS & Atom feeds — and CI results — on the boards of Signboard-Solo: an airport split-flap board, a station LED board, and a securities-style stock board, in a section of the Explorer. Each feed is a platform (a gate, a track), and every topic arrives like a plane or a train.
It is the first "-Duo": where a "-Solo" is complete on its own and fully local, a "-Duo" works by pairing with something else — here, the feeds you choose. The pairing stays minimal: read-only polling of the URLs you configure, nothing more.
Current version: v1.3.6
📸 Screenshots
LED board — a station departure board behind a dot mask. Long headlines scroll so they can be read to the end, and the announcement line at the bottom highlights the line name, the arrival count and the last fetched time.
Split-flap board — airport arrivals, one flap tile per character, flipping over to the next page when a platform has more topics than fit.
Stock board — quotes as securities panels: the current price is large, the change is coloured (up is red, down is green) and the day's open / high / low ride underneath.
📑 Table of Contents
💡 Key Features
Three Boards, One Button
- A title-bar button rotates the board style: split-flap → LED → stock board. The button's glyph follows the board you are looking at.
- On the flap board each feed is a GATE; on the LED board, a platform track; on the stock board, a market.
- The stock board carries a small "No trading" badge, so nobody at the office mistakes it for real trading — the flap and LED boards need no such note: their motifs give the joke away at a glance.
Feeds as Platforms
- Up to 20 feeds (RSS 1.0 / RSS 2.0 / Atom), one platform per page, polled with conditional requests (ETag / Last-Modified).
- Topics arrive with the board's animation; a topic that leaves the feed stays on the board for
keepHours, then departs. Click a row to open its link.
- The flap board's logo cell shows each site's own favicon; the LED board's announcement line greets you in the name of the platform on screen.
- CI build-result feeds (
"kind": "ci" — Jenkins, Bamboo, TeamCity and similar) read the verdict from the item title: failed builds show as cancelled, and the result words are trimmed from the title (the build number stays).
Long Headlines, Readable
- LED headlines scroll one way (never bouncing back against the reading direction); flap headlines flip through in segments.
- A page never rotates away before its longest headline has been shown in full.
- The flap remark plate shows status words only (arrived / updated / suspended), so only one text per row ever moves — feed descriptions live in the row tooltip.
Colour Themes
- A title-bar palette button cycles Duo Green / Lime / Ice; the choice is remembered.
Read-Only by Design
- The only network traffic is GET polling of the URLs you configure. No telemetry, no tracking, no sending anything anywhere.
- Tokens for authenticated feeds live in VS Code SecretStorage — settings hold only the auth type.
📦 Installation & Updates
Method 1: Install from Visual Studio Marketplace (Recommended)
A. Install via VS Code UI
- Open VS Code and click the Extensions icon on the Activity Bar (
Ctrl+Shift+X / Cmd+Shift+X).
- Search for
Signboard-Duo.
- Click the Install button.
B. Install via Web Browser
- Visit the Signboard-Duo Marketplace Page.
- Click Install and follow the browser prompts to open and install in VS Code.
Method 2: Install from Open VSX Registry
For VSCodium, Gitpod, Eclipse Theia, or environments configured with Open VSX:
- Visit the Signboard-Duo Open VSX Page.
- Install via your editor's extension manager or download the
.vsix package directly.
Method 3: Install from VSIX Package File (Offline / Manual)
- Go to the GitHub Releases page.
- Download the
.vsix file (e.g., signboard-duo-1.3.6.vsix) under Assets.
- In VS Code Extensions view (
Ctrl+Shift+X), click the "..." (Views and More Actions) icon at the top right, select Install from VSIX..., and choose the downloaded file.
🚀 How to Use
1. Open the board
Open the Explorer and expand the Signboard-Duo section. With no feeds configured yet, a guidance platform explains what to do.
2. Add feeds
Add feeds to signboardDuo.feeds in your settings.json — the Starter Feeds below are copy-paste ready. The board starts moving on the next poll (or run Signboard-Duo: Refresh Feeds Now).
3. Switch the board and the theme
- The rightmost title-bar button rotates flap → LED → stock board; its glyph always shows the current board.
- The palette button cycles the colour theme (Duo Green / Lime / Ice).
- The previous / next platform buttons move between feeds, and the pin button holds the current platform (auto-rotation and new-arrival jumps pause while pinned). Scrolling the mouse wheel over the LED board also moves platforms.
4. Read the board
- New topics arrive with a flap / LED flourish, and the board jumps to their platform (unless pinned).
- Topics that leave the feed remain for the feed's
keepHours, marked as updated when their title changes.
- Click a row to open the topic in your browser.
5. Move it somewhere else
Drag the Signboard-Duo section header to the secondary side bar (right side) or the panel. VS Code remembers where you put it.
📋 Starter Feeds
A mix for English readers: link culture, world news, and tech press. Copy the whole block into your settings.json.
"signboardDuo.feeds": [
{ "id": "hacker-news", "name": "Hacker News", "url": "https://news.ycombinator.com/rss", "maxItems": 5, "keepHours": 12 },
{ "id": "bbc-news", "name": "BBC News", "url": "https://feeds.bbci.co.uk/news/rss.xml", "maxItems": 5, "keepHours": 12 },
{ "id": "the-verge", "name": "The Verge", "url": "https://www.theverge.com/rss/index.xml", "maxItems": 5, "keepHours": 24 },
{ "id": "github-blog", "name": "GitHub Blog", "url": "https://github.blog/feed/", "maxItems": 4, "keepHours": 48 },
{ "id": "vscode-releases", "name": "VS Code Releases", "url": "https://github.com/microsoft/vscode/releases.atom", "maxItems": 4, "keepHours": 72 }
],
"signboardDuo.pollMinutes": 15
Stock quotes
Set "kind": "stock" on a feed that returns quotes as JSON (CNBC quote shape) and the platform renders as securities-style panels on the stock board: name and symbol in the head, the current price big and white, the change coloured by direction (red up / green down, Japanese convention), and a quiet Open / High / Low strip.
For US markets (S&P 500, Dow, Nasdaq, Apple, USD/JPY):
{
"id": "markets-us",
"name": "US Markets",
"kind": "stock",
"maxItems": 10,
"url": "https://quote.cnbc.com/quote-html-webservice/restQuote/symbolType/symbol?symbols=SPX%7C.DJI%7C.IXIC%7CAAPL%7CJPY%3D&requestMethod=itv&noform=1&partnerId=2&fund=1&exthrs=1&output=json"
}
Note: that endpoint is a public, unofficial one — it may change or stop without notice, and quotes may be delayed. Symbols use CNBC's notation (.N225, .TOPX, SPX, JPY=, 9984-JP, …); a symbol the provider does not know is simply skipped.
🔎 Finding Feeds
Many sites publish RSS/Atom feeds without making a fuss about them. A few ways to find one for a site you like:
- Look for the icon or a link — an orange RSS icon, or a "RSS / Atom / Feed" link in the site's footer or sidebar.
- Try the usual addresses — add
/feed/ to the site's URL (WordPress sites), or try /rss, /rss.xml, /atom.xml, /index.xml. The starter lists above are all examples of these patterns.
- GitHub is all feeds — append
.atom to a repository's releases or commits page (https://github.com/<owner>/<repo>/releases.atom). Issues and pull requests have feeds too.
- Peek at the page source — open the site's top page, view its HTML source (right-click → "View page source"), and search for
application/rss+xml. The href next to it is the feed URL the site itself declares.
- Microsoft 365 — the Microsoft 365 Roadmap offers RSS: filter the roadmap view to the products you care about, then use the RSS icon above the filters to get that view's feed URL. Official Microsoft blogs publish feeds as well. SharePoint lists can also emit RSS (List Settings → RSS Settings), but they sit behind Microsoft 365 sign-in, which Duo's token types cannot perform — so SharePoint feeds are not usable here in practice.
- Check before you paste — open the candidate URL in a browser. A feed shows as raw XML text; if you see a normal web page, it is not a feed. If Duo shows a fetch error for a feed, the URL is usually a page rather than a feed.
⌨️ Commands
| Command Name |
Command ID |
Description |
| Show Flap Board |
signboardDuo.showFlap |
Switch the board to the split-flap style |
| Show LED Board |
signboardDuo.showLed |
Switch the board to the LED style |
| Show Stock Board |
signboardDuo.showStock |
Switch the board to the stock style |
| Switch Board Style |
signboardDuo.cycleMode |
Rotate flap → LED → stock (the title-bar button) |
| Switch Colour Theme |
signboardDuo.cycleTheme |
Cycle Duo Green / Lime / Ice |
| Refresh Feeds Now |
signboardDuo.refresh |
Fetch all feeds immediately |
| Previous Platform |
signboardDuo.prevPlatform |
Move to the previous feed's platform |
| Next Platform |
signboardDuo.nextPlatform |
Move to the next feed's platform |
| Pin This Platform |
signboardDuo.pinPlatform |
Hold the current platform (pauses rotation and jumps) |
| Unpin Platform |
signboardDuo.unpinPlatform |
Release the pin |
| Set Feed Token |
signboardDuo.setToken |
Store a feed's token in SecretStorage |
| Delete Feed Token |
signboardDuo.deleteToken |
Remove a feed's stored token |
🔧 Settings
| Setting |
Default |
Description |
signboardDuo.feeds |
[] |
Feeds shown as platforms (up to 20). Each feed: id, name, url, kind (generic / ci / status / jma / stock), enabled, maxItems, keepHours, auth (type only) |
signboardDuo.pollMinutes |
15 |
Feed polling interval in minutes (minimum 5) |
signboardDuo.mode |
flap |
Board style: flap / led / stock, or auto (flap below 540px, LED at 540px and wider) |
signboardDuo.scrollLongText |
true |
Scroll (LED) or flip through (flap) long titles instead of truncating them |
signboardDuo.ledPitch |
3 |
LED dot pitch in px |
signboardDuo.ledHole |
38 |
LED hole size, as a percentage of the dot pitch |
signboardDuo.ledGlow |
true |
Add a soft glow behind the LED board's letters |
Settings can be changed via VS Code Settings (Ctrl+, / Cmd+,).
Each entry in signboardDuo.feeds accepts these fields:
| Field |
Default |
Description |
id |
(auto) |
Stable feed id; also keys the stored token |
name |
feed title |
Platform name shown on the board |
url |
— |
Feed URL (http / https) |
kind |
generic |
How items are interpreted — see the kinds table below |
enabled |
true |
Disabled feeds get no platform number |
maxItems |
4 |
Rows kept per platform (1–20) |
keepHours |
24 |
Hours a row stays on the board after leaving the feed (1–168) |
auth |
none |
none / bearer / basic / header — the type only; the secret itself is stored via the Set Feed Token command |
Feed kinds:
kind |
Intended for |
How the board treats it |
generic |
Any RSS/Atom feed |
Items as-is; the item's category (or a shortened summary) becomes the remark |
ci |
CI build results (Jenkins, Bamboo, TeamCity and similar) |
The verdict is read from the title and the result words are trimmed (the build number stays); failed, unstable or aborted runs show as cancelled |
status |
Status pages |
Presentation only: a STS chip on the flap board, a limited-express type on the LED board; items are interpreted like generic |
jma |
Japan Meteorological Agency feeds |
Presentation only: a WX chip on the flap board, a local type on the LED board; items are interpreted like generic |
stock |
Quote JSON in the CNBC shape |
The platform renders as securities-style panels on the stock board instead of flap/LED rows |
Proxy: Duo reads VS Code's built-in http.proxy, http.noProxy and http.proxyStrictSSL settings (the HTTPS_PROXY / NO_PROXY environment variables are the fallback), so a proxy you already configured for VS Code applies to feeds as well. If a feed cannot be reached, see Troubleshooting.
Authenticated feeds
For feeds with auth, run Signboard-Duo: Set Feed Token to store the secret in SecretStorage; only the auth type lives in settings. CI build-result feeds use "kind": "ci" (the former "bamboo" kind is treated as "ci").
📋 Requirements
- VS Code:
v1.90.0 or later
- OS: Windows, macOS, Linux
- Network access to the feed URLs you configure. No accounts or API keys, unless your own feeds require tokens.
🔒 Data Storage & Privacy
The only network traffic is read-only GET polling of the feed URLs you configured (with ETag / Last-Modified conditional requests). There is no telemetry and no tracking, and nothing is sent anywhere else. The latest topics are kept in VS Code's standard extension storage on your machine so the board survives restarts; feed tokens are in SecretStorage, never in settings. The board also loads each feed's favicon from that feed's own origin, as an image.
🛡️ Security
Feed content is treated as untrusted text and can never turn into code:
- The parser is hand-rolled and resolves no external entities (no XXE, no entity-expansion attacks); entity decoding is a single pass into plain text, and descriptions have their markup stripped before display.
- Every renderer inserts feed text as text, never as HTML, and the webview runs under a strict Content Security Policy (
default-src 'none', nonce-only scripts, images over https only) — even a crafted headline stays inert text on the board.
- Clicking a row opens only
http:// / https:// links. Fetches go only to the URLs you configured, with a 10-second timeout, a 1 MB body cap and at most 5 redirects.
- What remains: a feed you choose can still show misleading headlines as plain text — pick feeds you trust.
🧭 Roadmap
- Richer CI title-verdict patterns for the
ci kind, as real samples arrive.
- Live-state providers (Bamboo / GitHub Actions REST APIs) alongside the RSS core.
- More sources in the same shape: pull requests, AI-agent sessions.
- Real train information (public-transport open data) — the current challenge dataset has no Sagami Railway (Sotetsu) data, so this waits.
🛠️ Developer Documentation
- Development and release rules for contributors and AI agents: AGENTS.md
- Build & test:
npm run check # syntax check for all JS
npm test # unit tests (node --test)
npm run package # build the VSIX
npm run check-version
🛠️ Troubleshooting
Signboard-Duo fetches feeds directly, or through the proxy configured in VS Code's own settings (http.proxy / http.noProxy). When a platform cannot fetch its feed, the board shows what happened on that platform — click the message to jump to the matching entry below.
Which case am I?
- External feed on a company network: if your company only allows internet access through a proxy, set the proxy in VS Code's
http.proxy setting. Duo uses the same setting, so a VS Code that already reaches the internet through the proxy makes Duo work too.
- Feed hosted inside the company network: an internal RSS/Atom server must not be fetched through the proxy. Add its host to
http.noProxy (for example rss.internal.example.com); otherwise the request is sent to the proxy and fails there.
- PAC-based assignment: if your company assigns proxies with a PAC file and also publishes a fixed proxy host, set that host in
http.proxy. Duo does not evaluate PAC files, so with no fixed host available it cannot fetch through a PAC-only setup.
Server not found (DNS)
The feed's host name could not be resolved. Check the URL for typos. If the host only exists inside a company network, its name may only resolve on the company DNS — and when a proxy is configured, the proxy resolves names instead, which fails for purely internal names (the internal-feed case above).
Cannot connect to the server
The server refused the connection or is unreachable: it may be down, a firewall may block the port, or the address may only be reachable through a proxy that is not configured yet. If the same URL opens in your browser, compare how the browser connects — a proxy, most likely.
No response (timeout)
The server or an intermediary did not answer in time (Duo gives up at about 30 seconds). Congestion, a silently dropping proxy, or a filtering proxy holding the request can all cause this. If every feed times out while the browser works, suspect the proxy path.
Certificate error
The server's TLS certificate could not be verified — expired, self-signed, issued by a company-internal CA, or presented by a TLS-inspecting proxy whose CA is not trusted here. The durable fix is a properly chained certificate on the feed server. For connections through a proxy, VS Code's http.proxyStrictSSL: false relaxes verification — only use it when you understand the risk.
Cannot reach the proxy
A proxy is configured in http.proxy but did not answer: a wrong host or port, the proxy is down, or you are on a different network than the setting assumes (a common laptop case: the office proxy setting, at home). Duo follows http.proxy exactly — check that setting first.
Proxy authentication required (407)
The proxy wants credentials. Put them in the proxy URL in http.proxy — http://user:password@proxy.example.com:8080 — or set http.proxyAuthorization. URL-encode special characters in the password (@ becomes %40, and so on). The credentials live in VS Code's own setting; Duo stores nothing itself.
The server replied with an error (HTTP …)
The board shows the status code. A 404 usually means the feed path is wrong — check the URL. A 5xx is the server's side, and a 429 means you are rate-limited; the next poll may succeed. If a login page comes back with a 200, that is the unreadable-feed case below.
The feed asks for authentication (401 / 403)
The feed itself needs credentials. Set the feed's auth type in settings and run Signboard-Duo: Set Feed Token to store the secret in SecretStorage. Feeds behind single sign-on usually need a personal access token issued by that service.
The response is not a readable feed
The URL answered, but not with RSS / Atom (or quote JSON for stock). It often points at an HTML page — sometimes a login page — instead of the feed itself. Look for the site's real feed URL (see Finding Feeds).
Settings error
The feed entry itself is invalid: id must match ^[a-z0-9-]+$ and be unique, and url must start with http:// or https://. The Signboard-Duo Output channel names the entry that was rejected.
📄 License
MIT License
Japanese (日本語)
Signboard-Duo は、RSS / Atom フィードや CI の結果を、Signboard-Solo の盤面——空港のフラップ盤、駅の LED 盤、証券ボード風の株価ボード——で眺める VS Code 拡張です。エクスプローラーのセクションに常駐します。フィードが「番線/ゲート」、届いたトピックが「電車/飛行機」になります。
初の「-Duo」です。「-Solo」が単体完結・完全ローカルなのに対して、「-Duo」は何かと組んで初めて成り立ちます。ここでの相手は、あなたが選んだフィードです。連携は最小限に留めます。設定した URL への読み取り専用のポーリング、それだけです。
現在のバージョン: v1.3.6
📸 スクリーンショット
LED ボード ─ 駅の発車標をドットマスク越しに。長い見出しは最後まで読めるように流れ、最下行の案内では線名・到着件数・最終取得時刻が色を変えて点滅します。
フラップボード ─ 空港の到着盤。1文字1枚のタイルで、番線の件数が入りきらないときはページがめくれます。
株価ボード ─ 証券ボード式のパネル。現在値を大きく、前日比は色で(上昇=赤、下落=緑)、下段に始値・高値・安値を並べます。
📑 目次
💡 主な機能
3つの盤面、ボタン1つで切替
- ビューのタイトルバーのボタンで、盤面スタイルが フラップ → LED → 株価ボード とローテートします。ボタンのグリフは、いま見ている盤面に追従します。
- フラップではフィードが GATE(ゲート)、LED では番線、株価ボードでは市場になります。
- 株価ボードには小さな 「売買できません」 バッジが付きます。仕事中に同僚が見ても株の売買と誤解されないためです。フラップと LED は見た瞬間にモチーフが分かるので、注釈は不要です。
フィード=番線
- 最大 20件 のフィード(RSS 1.0 / RSS 2.0 / Atom)を、1フィード=1ページで表示します。取得は条件付きリクエスト(ETag / Last-Modified)です。
- トピックは盤面のアニメーションで到着し、フィードから消えても
keepHours の間は盤面に残ってから発ちます。行をクリックするとリンクが開きます。
- フラップのロゴ欄には各サイト自身の ファビコン、LED のテロップは表示中の番線の名前で挨拶します。
- CI のビルド結果フィード(
"kind": "ci"、Jenkins・Bamboo・TeamCity など)では、タイトルの結果語から成否を読みます:失敗したビルドは運休として表示され、結果語はタイトルから取り除かれます(ビルド番号は残ります)。
長い見出しを、読める形で
- LED の見出しは 一方向 にスクロールします(読みの向きに逆らう往復はしません)。フラップは区切りめくりです。
- ページは、そのページで一番長い見出しが最後まで表示されるまで、次のページに移りません。
- フラップの 備考プレートはステータス表示(到着/更新/運休)に徹します。1行の中で動く文字は1つだけにし、フィードの概要文は行のツールチップで読めます。
配色テーマ
- タイトルバーのパレットボタンで Duo Green / Lime / Ice を切り替えます。選択は記憶されます。
読み取り専用が設計の前提
- ネットワーク通信は、あなたが設定した URL への GET ポーリングだけです。テレメトリもトラッキングも、どこかへ何かを送ることもありません。
- 認証フィードのトークンは VS Code の SecretStorage に保管し、設定には方式だけを書きます。
📦 インストール/アップデート方法
方法 1: Visual Studio Marketplace からのインストール(推奨)
A. VS Code UI からインストール
- VS Code でアクティビティバーの 拡張機能アイコン(
Ctrl+Shift+X / Cmd+Shift+X)を開きます。
Signboard-Duo で検索します。
- インストール ボタンをクリックします。
B. Web ブラウザからインストール
- Signboard-Duo の Marketplace ページ を開きます。
- Install をクリックし、ブラウザの案内に従って VS Code でインストールします。
方法 2: Open VSX Registry からのインストール
VSCodium、Gitpod、Eclipse Theia など、Open VSX を使う環境向けです。
- Signboard-Duo の Open VSX ページ を開きます。
- エディタの拡張機能マネージャーからインストールするか、
.vsix パッケージを直接ダウンロードします。
方法 3: VSIX パッケージファイルからのインストール(オフライン環境等)
- GitHub Releases ページを開きます。
- Assets の
.vsix ファイル(例: signboard-duo-1.3.6.vsix)をダウンロードします。
- VS Code の拡張機能ビュー(
Ctrl+Shift+X)右上の 「...」(ビューとその他のアクション) から VSIX からのインストール... を選び、ダウンロードしたファイルを指定します。
🚀 使い方
1. 盤面を開く
エクスプローラー を開き、Signboard-Duo セクションを展開します。フィード未設定の間は、案内用の番線が表示されます。
2. フィードを追加する
settings.json の signboardDuo.feeds にフィードを追加します。下のスターターフィードはそのままコピペできます。次の取得タイミングで盤面が動き出します(Signboard-Duo: フィードを今すぐ更新 ですぐ取得もできます)。
3. 盤面とテーマを切り替える
- タイトルバー右端のボタン でフラップ → LED → 株価ボードとローテートします。グリフは常に現在の盤面を示します。
- パレットボタン で配色テーマ(Duo Green / Lime / Ice)を切り替えます。
- 前の番線/次の番線 ボタンでフィード間を移動し、ピン ボタンで現在の番線に固定します(固定中は自動送りと新着ジャンプが止まります)。LED 盤面ではマウスホイールでも番線を移動できます。
4. 盤面を眺める
- 新着トピックはフラップ/LED の演出で到着し、盤面はその番線へジャンプします(ピン留め中を除く)。
- フィードから消えたトピックは、そのフィードの
keepHours の間だけ残ります。タイトルが変わったトピックは「更新」と表示されます。
- 行をクリックすると、トピックがブラウザで開きます。
5. 置き場所を変える
Signboard-Duo セクションの見出しを、セカンダリサイドバー(右側)やパネルへドラッグできます。置き場所は VS Code が記憶します。
📋 スターターフィード
日本語圏のおすすめです。そのまま settings.json にコピペすれば、すぐに盤面が動き出します。
"signboardDuo.feeds": [
{ "id": "nhk-top", "name": "NHK 主要", "url": "https://www.nhk.or.jp/rss/news/cat0.xml", "maxItems": 5, "keepHours": 12 },
{ "id": "itmedia-bursts", "name": "ITmedia 速報", "url": "https://rss.itmedia.co.jp/rss/1.0/news_bursts.xml", "maxItems": 5, "keepHours": 12 },
{ "id": "yahoo-topics", "name": "Yahoo!ニュース", "url": "https://news.yahoo.co.jp/rss/topics/top-picks.xml", "maxItems": 5, "keepHours": 12 },
{ "id": "hatena-it", "name": "はてな 人気IT", "url": "https://b.hatena.ne.jp/hotentry/it.rss", "maxItems": 4, "keepHours": 48 },
{ "id": "jma-extra", "name": "気象庁 随時", "url": "https://www.data.jma.go.jp/developer/xml/feed/extra.xml", "kind": "jma", "maxItems": 5, "keepHours": 24 }
],
"signboardDuo.pollMinutes": 15
株価ボード
相場を JSON で返すフィードに "kind": "stock" を付けると、その番線は株価ボードで証券ボード風のパネル表示になります。銘柄とシンボル、大きな現在値、色で語る前日比(日本の慣例で、上昇=赤、下落=緑)、そして始値・高値・安値の帯が付きます。
日本向け(日経平均・TOPIX・ドル円・ソフトバンクグループ):
{
"id": "markets-jp",
"name": "東京市場",
"kind": "stock",
"maxItems": 10,
"url": "https://quote.cnbc.com/quote-html-webservice/restQuote/symbolType/symbol?symbols=.N225%7C.TOPX%7CJPY%3D%7C9984-JP&requestMethod=itv&noform=1&partnerId=2&fund=1&exthrs=1&output=json"
}
注意:上記エンドポイントは非公式の公開エンドポイントで、予告なく変わったり止まったりすることがあります。価格は遅延配信の場合があります。シンボルは CNBC の表記(.N225、.TOPX、SPX、JPY=、9984-JP など)で、提供側が知らないシンボルは単にスキップされます。
🔎 フィードの探し方
多くのサイトは、目立たない形で RSS/Atom フィードを公開しています。好きなサイトのフィードを見つける方法をいくつか紹介します。
- アイコンやリンクを探す — オレンジ色の RSS アイコンや、サイトのフッター・サイドバーにある「RSS/Atom/フィード」のリンクが手がかりです。
- よくあるアドレスを試す — サイトの URL に
/feed/ を付ける(WordPress のサイト)、/rss、/rss.xml、/atom.xml、/index.xml を試す、といった方法があります。上のスターターフィードは、どれもこのパターンの実例です。
- GitHub は全部フィード — リポジトリのリリースやコミットのページ URL に
.atom を付けるとフィードになります(https://github.com/<owner>/<repo>/releases.atom)。Issue やプルリクエストにもフィードがあります。
- ページのソースを覗く — サイトのトップページで HTML ソースを表示し(右クリック →「ページのソースを表示」)、
application/rss+xml を検索します。その横の href が、サイト自身が宣言しているフィード URL です。
- Microsoft 365 — Microsoft 365 ロードマップが RSS に対応しています。ロードマップの表示を関心のある製品で絞り込んでから、フィルターの上にある RSS アイコンで、その表示のフィード URL を取得します。Microsoft の公式ブログもフィードを公開しています。SharePoint のリストも RSS を出せます(リストの設定 → RSS の設定)が、Microsoft 365 のサインインの内側にあるため Duo のトークン方式では通せず、実質的には使えません。
- 貼る前に確かめる — 候補の URL は、まずブラウザで開いてください。XML のテキストが表示されればフィードです。通常の Web ページが見えたら、それはフィードではありません。Duo で取得エラーになる場合も、URL がフィードではなくページであることがほとんどです。
⌨️ コマンド
| コマンド名 |
コマンド ID |
説明 |
| フラップ表示に切り替え |
signboardDuo.showFlap |
盤面をフラップ式に切り替える |
| LED表示に切り替え |
signboardDuo.showLed |
盤面を LED 式に切り替える |
| 株価ボード表示に切り替え |
signboardDuo.showStock |
盤面を株価ボードに切り替える |
| 盤面スタイルを切り替え |
signboardDuo.cycleMode |
フラップ → LED → 株価ボードとローテートする(タイトルバーのボタン) |
| 配色テーマを切り替え |
signboardDuo.cycleTheme |
Duo Green / Lime / Ice を切り替える |
| フィードを今すぐ更新 |
signboardDuo.refresh |
全フィードをすぐに取得する |
| 前の番線へ |
signboardDuo.prevPlatform |
前のフィードの番線へ移動する |
| 次の番線へ |
signboardDuo.nextPlatform |
次のフィードの番線へ移動する |
| この番線をピン留め |
signboardDuo.pinPlatform |
現在の番線に固定する(自動送りとジャンプが止まる) |
| ピン留めを解除 |
signboardDuo.unpinPlatform |
ピン留めを外す |
| フィードのトークンを設定 |
signboardDuo.setToken |
フィードのトークンを SecretStorage に保存する |
| フィードのトークンを削除 |
signboardDuo.deleteToken |
保存したトークンを削除する |
🔧 設定
| 設定 |
既定値 |
説明 |
signboardDuo.feeds |
[] |
番線として表示するフィード(最大20件)。各フィードの項目は id、name、url、kind(generic / ci / status / jma / stock)、enabled、maxItems、keepHours、auth(方式のみ) |
signboardDuo.pollMinutes |
15 |
フィードの取得間隔(分、最小5) |
signboardDuo.mode |
flap |
盤面スタイル:flap / led / stock、または auto(540px 未満はフラップ、540px 以上は LED) |
signboardDuo.scrollLongText |
true |
長いタイトルを切り捨てず、LED ではスクロール、フラップでは区切りめくりで表示する |
signboardDuo.ledPitch |
3 |
LED のドット間隔(px) |
signboardDuo.ledHole |
38 |
LED の穴の大きさ(ドット間隔に対する%) |
signboardDuo.ledGlow |
true |
LED の文字の後ろに柔らかなグロー(にじみ)を付ける |
設定は VS Code の設定画面(Ctrl+, / Cmd+,)から変更できます。
signboardDuo.feeds の各要素には、次のフィールドが書けます。
| フィールド |
既定値 |
説明 |
id |
(自動) |
フィードの安定した ID。保存するトークンのキーにもなる |
name |
フィードのタイトル |
盤面に出る番線名 |
url |
— |
フィードの URL(http / https) |
kind |
generic |
項目の解釈の仕方 — 下の種別表を参照 |
enabled |
true |
無効にしたフィードには番線番号が付かない |
maxItems |
4 |
1番線に保持する行数(1–20) |
keepHours |
24 |
フィードから消えた行を盤面に残す時間(1–168) |
auth |
none |
none / bearer / basic / header — 方式のみ。秘密情報そのものは「フィードのトークンを設定」コマンドで保存する |
フィード種別:
kind |
向いているもの |
盤面での扱い |
generic |
任意の RSS/Atom フィード |
項目をそのまま表示。備考はカテゴリ(なければ概要の短縮) |
ci |
CI のビルド結果(Jenkins、Bamboo、TeamCity など) |
タイトルから成否を読み、結果語を取り除く(ビルド番号は残る)。失敗・不安定・中断は運休表示 |
status |
ステータスページ |
表示のみ:フラップ盤面では STS チップ、LED 盤面では特急タイプ。項目の解釈は generic と同じ |
jma |
気象庁のフィード |
表示のみ:フラップ盤面では WX チップ、LED 盤面では普通タイプ。項目の解釈は generic と同じ |
stock |
CNBC 形式の相場 JSON |
フラップ/LED の行ではなく、株価ボードの証券風パネルとして表示される |
プロキシ: Duo は VS Code 本体の http.proxy、http.noProxy、http.proxyStrictSSL 設定を読みます(環境変数 HTTPS_PROXY / NO_PROXY は予備)。VS Code 用に設定済みのプロキシがそのままフィードにも効きます。フィードに届かないときはトラブルシュートを見てください。
認証フィード
auth を使うフィードは、コマンド Signboard-Duo: フィードのトークンを設定 で秘密情報を SecretStorage に保存します。設定に残るのは方式だけです。CI のビルド結果フィードは "kind": "ci" を使います(旧 "bamboo" は "ci" として扱われます)。
📋 動作要件
- VS Code:
v1.90.0 以上
- OS: Windows、macOS、Linux
- 設定したフィード URL へのネットワークアクセス。自分のフィードがトークンを要求する場合を除き、アカウントや API キーは不要です。
🔒 データの保存について
ネットワーク通信は、設定したフィード URL への読み取り専用の GET ポーリングだけです(ETag / Last-Modified による条件付きリクエスト)。テレメトリもトラッキングもなく、どこかへ何かを送ることもありません。最新のトピックは、再起動後も盤面が残るよう、お使いのマシン上の VS Code の標準の拡張ストレージに保存されます。フィードのトークンは SecretStorage の中だけで、設定には残りません。ファビコンは、各フィード自身の配信元から画像として読み込みます。
🛡️ セキュリティ
フィードの内容は「信用できないテキスト」として扱い、コードには決してなりません。
- パーサは自前実装で、外部実体を解決しません(XXE や実体展開攻撃は不成立)。実体のデコードは1回だけ行われ、結果はただの文字列です。概要文は表示前にマークアップを取り除きます。
- すべての盤面で、フィードのテキストは HTML としてではなくテキストとして挿入されます。Webview には厳格な Content Security Policy(
default-src 'none'、スクリプトは nonce のみ、画像は https のみ)を掛けているので、細工した見出しも盤面の上の無力な文字に留まります。
- 行クリックで開くのは
http:// / https:// のリンクだけです。取得は設定した URL へのみで、タイムアウト10秒、本文上限1MB、リダイレクトは最大5回までです。
- 残るのは「選んだフィードが嘘の見出しを文字として表示すること」だけです。信頼できるフィードを選んでください。
🧭 ロードマップ
- Bamboo ビルド結果のタイトルパターン対応(実物の Bamboo RSS サンプルが手に入り次第)。
- RSS を核に、ライブ状態を取るプロバイダ(Bamboo / GitHub Actions の REST API)を追加。
- 同じ形の情報源を増やす:プルリクエスト、AI エージェントのセッション。
- 本物の電車情報(公共交通オープンデータ)。現在のチャレンジのデータセットに相鉄が無いため、保留中です。
🛠️ 開発者向けドキュメント
- 開発とリリースのルール(貢献者と AI エージェント向け): AGENTS.md
- ビルドとテスト:
npm run check # 全 JS の構文チェック
npm test # 単体テスト(node --test)
npm run package # VSIX を生成
npm run check-version
🛠️ トラブルシュート
Signboard-Duo の取得は直接接続か、VS Code 本体の設定(http.proxy / http.noProxy)にあるプロキシ経由です。番線のフィードを取得できなかったときは、盤面に何が起きたかを表示します。その表示をクリックすると、下の該当する項目へ飛びます。
まずケースの切り分け
- 会社のネットワークから外部のフィードを読む: 会社がプロキシ経由でしか外に出られない場合は、VS Code の
http.proxy にプロキシを設定してください。Duo は同じ設定を使うので、VS Code がプロキシ経由で外に出られているなら Duo もそのまま動きます。
- フィードが社内にある: 社内に置かれた RSS/Atom サーバーは、プロキシを経由させてはいけません。そのホストを
http.noProxy に加えてください(例:rss.internal.example.com)。入れていないと要求がプロキシへ送られ、そこで失敗します。
- PAC で割り当てられている: 会社が PAC ファイルでプロキシを割り当てていて、固定のプロキシホストも公開されている場合は、そのホストを
http.proxy に設定してください。Duo は PAC ファイルを評価しないため、固定ホストが無い PAC のみの環境では取得できません。
サーバーが見つからない(DNS)
フィードのホスト名を解決できませんでした。URL のタイプミスを確認してください。社内だけに存在するホストは、社内の DNS でしか解決できないことがあります。また、プロキシ設定時は名前解決をプロキシ側が行うため、社内専用の名前は失敗します(上の社内フィードのケース)。
サーバーに接続できない
接続が拒否されたか、サーバーに到達できません。サーバーの停止、ファイアウォールによるポート遮断、あるいは未設定のプロキシ経由でしか届かないアドレス、といった原因が考えられます。同じ URL がブラウザで開けるなら、ブラウザがどう接続しているか(大抵はプロキシ)と比べてください。
応答がない(タイムアウト)
サーバーか中継機器が時間内に応答しませんでした(Duo は約30秒で諦めます)。混雑、応答を黙って捨てるプロキシ、検査のために要求を保留するプロキシなどが原因になります。全フィードがタイムアウトするのにブラウザでは開ける場合は、プロキシ経路を疑ってください。
証明書エラー
サーバーの TLS 証明書を検証できませんでした。期限切れ、自己署名、社内 CA の発行、あるいは TLS を検査するプロキシが提示する証明書で、その CA がここでは信頼されていない場合に起きます。恒久対処はフィードサーバー側に正しくチェーンした証明書を入れることです。プロキシ経由の接続では VS Code の http.proxyStrictSSL: false で検証を緩められますが、リスクを理解したうえで使ってください。
プロキシに接続できない
http.proxy にプロキシが設定されていますが、応答がありません。ホストやポートの誤り、プロキシの停止、あるいは設定が想定するネットワークと違う場所にいる(ノートPCでありがちな「会社のプロキシ設定のまま自宅」)といったケースです。Duo は http.proxy にそのまま従うので、まずその設定を確認してください。
プロキシ認証が必要(407)
プロキシが資格情報を要求しています。http.proxy の URL に資格情報を含める(http://user:password@proxy.example.com:8080)か、http.proxyAuthorization を設定してください。パスワード中の特殊文字は URL エンコードが必要です(@ は %40 など)。資格情報は VS Code の設定の中だけにあり、Duo 自身は何も保存しません。
サーバーエラーが返った(HTTP …)
盤面にステータスコードが出ます。404 は大抵フィードのパスの誤りなので URL を確認してください。5xx はサーバー側の問題、429 はレート制限で、次の取得で成功することもあります。200 でログインページが返る場合は、下の「フィードを読めない」ケースです。
フィード側の認証が必要(401 / 403)
フィード自体が資格情報を要求しています。設定でフィードの auth 方式を指定し、コマンド Signboard-Duo: フィードのトークンを設定 で秘密情報を SecretStorage に保存してください。シングルサインオンの内側にあるフィードは、そのサービスが発行する個人用アクセストークンが必要なことが多いです。
フィードを読めない
URL は応答しましたが、RSS / Atom(stock の場合は相場 JSON)ではありませんでした。フィードではなく HTML ページ(ログインページのこともあります)を指しているケースが多いです。サイトの本当のフィード URL を探してください(フィードの探し方)。
設定エラー
フィードの項目自体が不正です。id は ^[a-z0-9-]+$ に一致し、重複がないこと、url は http:// か https:// で始まることが必要です。拒否された項目は Signboard-Duo の出力チャネルに出ます。
📄 ライセンス
MIT License