1. Collect
Collectors query approved public sources and record every attempt, including successful runs, failures, rate limits, timestamps, and errors.
Datoro Media
A complete guide to the dashboard, its controls, the evidence behind each finding, and the limits of the current data.
This is an internal, monitor-only intelligence tool. It turns public mention evidence and imported history into a review queue showing what is being said, where it happened, how urgent it may be, and what action could follow. It is a decision aid, not a complete index of the internet and not a tool for public engagement. The current operating scope is FXV-first. The registry keeps a clear path for expanding to the other registered brands later.
These cards read the current hub.json export and its recorded provenance. They are a quick health check for the page you are looking at. A green card means the corresponding data is present in this snapshot. Amber means review is recommended. Red means the dashboard is reporting a real limitation or failure.
Loading the latest export and source provenance.
A failed collector is not treated as zero mentions. The dashboard shows source availability so a quiet-looking result is not mistaken for complete coverage.
Collectors query approved public sources and record every attempt, including successful runs, failures, rate limits, timestamps, and errors.
Results are deduplicated, matched against the brand and routing registries, classified with deterministic rules, and retained with source evidence.
The reporting step writes Markdown intelligence items, a weekly brief, and the static JSON export that this browser page reads.
The main page is a static browser view of hub/dashboard/data/hub.json. It does not call collectors or SQLite directly. The controls change what is visible in your browser; they do not rewrite the source items or the export.
| Area | What it does | What to know |
|---|---|---|
| Brand | Selects All brands or one registered brand. | The current operating scope is FXV-first. FeelXVideos, FeelMe, and Net69 are present in the registry so the hub can expand later. |
| Theme toggle | Switches between dark and light presentation. | Your choice is saved in this browser under datoro-dashboard-theme. |
| Network view | Starts with the five-second view, then shows a separate high-attention queue followed by the broader action queue of findings that have not been marked taken care of in this browser. | The high-attention queue isolates complaint, scam, refund, and churn-signal intents and shows owner, status, suggested action, age, and source. Both queues use the selected brand scope; the high-attention queue is stable when the general Signal filter changes. |
| Archive view | Shows findings marked taken care of in this browser. | Archive state is browser-local workflow housekeeping. It does not delete the Markdown item, remove source evidence, or change the generated export. |
| Data provenance view | Shows latest source runs, targets, timestamps, run statuses, availability states, coverage confidence, counts, errors, and known coverage gaps. | Use this view before treating a low count or quiet period as meaningful. |
| Brand mentions view | Shows the raw normalized source feed separately from the classified action queue. | Filter by global Brand scope, keyword variant, date range, platform, sentiment, intent, source type, or optional subreddit. Each row keeps its evidence quality, source link, source context, collection method, and availability state; author names and raw JSON are not shown. |
| Guide icon | Opens this readme page. | This page runs its own system check against the same export used by the dashboard. |
The coverage panel and Data provenance view report the latest state of each source route. Coverage confidence describes what the recorded result supports; it is not a claim that the source is exhaustive.
| State | Meaning | Confidence label | How to read the count |
|---|---|---|---|
| Available | The route responded and returned one or more records. | Bounded | Results are available for this route and window; listed source gaps still limit completeness. |
| Partial | Some configured queries, communities, pages, or records were incomplete. | Partial | The count may omit activity and must not be treated as a complete volume. |
| Unavailable | The route failed, was blocked, or returned no usable result. | None | Unavailable is not zero activity. |
| Manual import | Evidence was supplied through a human-controlled CSV/JSON or webhook handoff. | Manual | Useful for review, but not automated or exhaustive coverage. |
| No match | The checked route completed without returning a matching record. | Not established | No match is not proof of zero activity. |
A repeated import can return existing records and insert zero new rows while remaining available or manual. The dashboard uses the returned count and explicit availability state, not the inserted-row count alone.
The Network view begins with a compact decision summary so a reviewer can identify the strongest available signal, its source, and the size of the action queue without opening the raw Brand mentions feed.
open or assigned in the selected scope. The breakdown shows urgent, heads-up, and positive or neutral items. Monitoring findings are not counted as work needing action now.complaint, scam, refund, and churn-signal intents. It shows the owner, recorded status, suggested action, relative age, and safe source link so a response-critical item remains visible even when overall volume is low. It follows the selected Brand scope and browser archive, not the general Signal filter.The summary is derived from the exported findings snapshot. It does not prove that a source was checked successfully or that the visible top signal is new; read the coverage and freshness information before treating it as current live activity.
The four metric tiles are scoped to the selected brand and all findings. They are intentionally not narrowed by signal or browser-local archive filters. The scope label above the tiles makes this explicit.
The Brand selector and Signal controls narrow the visible action queue. A finding remains visible only when it matches every active selection. The separate Brand mentions view has source-facing filters for keyword variant, date range, platform, sentiment, intent, source type, and the optional Reddit subreddit.
| Control | Options | Matching rule |
|---|---|---|
| Signal | All signals, Urgent attention, Heads up, Positive / neutral. | Urgent is high risk. Heads up is moderate risk or negative sentiment. Positive / neutral is the remaining signal group. |
| Brand mentions | Keyword variant, From date, To date, Platform, Sentiment, Intent, Source type, and optional Subreddit. | Every active feed filter must match. Date bounds are inclusive and use the mention's observed date, with published or collection time as a fallback. |
| Clear all filters | Appears when a Brand or Signal filter is active in the action queue, or when a source filter is active in Brand mentions. | Each clear control resets the filters for its own view. The Brand mentions control does not change the global Brand selector, dashboard view, or archive records. |
The general action queue remains intentionally compact. The separate high-attention queue carries the ownership and status fields needed for immediate review, while the raw Brand mentions view provides the detailed source filters needed for evidence review.
Each finding is a row on desktop and a stacked card on smaller screens. The four visible columns are:
| Column | Displayed information | How to use it |
|---|---|---|
| ID and dates | Signal dot before the stable NI-#### reference, optional review-state badge, first-seen date, and relative last-seen age. |
Use the signal and reference ID together when triaging or discussing the finding. A row becomes visually muted when its underlying last-seen date is at least 90 days old. The exact last-seen date, occurrence count, and item file path are intentionally omitted from the compact row. |
| What was found and source | Concise finding summary, captured verbatim comment when it is distinct from the summary, and each source shown as Source: followed by its platform, date, and safe original link. |
Use the summary to understand the issue immediately, then read the evidence before acting. If no distinct captured comment exists, the dashboard says No verbatim captured rather than presenting an analyst summary as a quote. |
| Type | The exported type label, with a safe fallback to the category or Needs review. | Use it as a routing hint, not as proof that the suggested action has been reviewed by a human. |
| Suggested action | Concise, team-directed action text, Asana copy button, and the archive or restore action. | The team prefix identifies the intended handoff, such as Technical team, Management team, Content team, or Social team. The underlying export still retains routing and action-provenance fields for handoff compatibility. |
The Brand mentions view is the source-facing layer. It is intentionally separate from the action queue so a record can be reviewed before it becomes an intelligence item. Use the global Brand selector together with the feed filters to narrow by keyword variant, inclusive observed-date range, platform, sentiment, intent, source type, and optional subreddit. A row shows platform, source type, source context, evidence quality, observed date, matched term, retained excerpt, classification, collection method, availability state, and an original source link. Reddit-specific fields such as subreddit and parent post remain optional metadata. The feed never displays raw JSON or author names by default.
matched_terms values exactly. From and To dates include both selected calendar days. Clear mention filters resets feed-only controls and leaves the global Brand selection unchanged.items/*.md, the SQLite store, or hub.json.Archive state is per browser profile. Another user or another browser will not see the same local archive unless a future persistence workflow is designed and approved.
The provenance view is the operational truth check. It renders one row for each latest recorded source run in the selected brand scope with:
Below the table, the page lists known coverage gaps from the export. A failed or rate-limited source remains visible as a source limitation. It is never silently converted into a successful zero-count run.
The dashboard distinguishes problems that happen at different stages:
The dashboard is strongest where a source is healthy and the evidence is directly available. It is directional, not exhaustive.
| Pool | How it enters | What it contributes | Current limitation |
|---|---|---|---|
| RSS-first term search, configured subreddit sweeps, and best-effort thread/comment RSS; read-only OAuth is available as an opt-in parallel path. | Community discussions, complaints, questions, product language, matched comments, parent titles, scores, and route provenance. | RSS and thread feeds may be blocked, rate-limited, malformed, truncated, or incomplete. OAuth needs a registered app and local authorization. Limitations remain visible and are never represented as zero mentions. | |
| EroScripts / Discourse | Public search endpoint with pagination and retry handling. | Niche forum discussion and technical or product signals. | The current endpoint has returned HTTP 429 rate limits. Counts are not trusted until an approved access path is available. |
| Legacy FXV history | Imported from the corrected legacy Mention Log export. | Historical context, source URLs, dates, and recorded actions. | Only the locally exported rows are available to the hub today. The remaining live Sheet rows still need reconciliation before migration is complete. |
| Manual and transition sources | X saved searches, Google Alerts, F5Bot webhook or JSON import, Feedly, and optional web research. | Additional coverage outside the automated collector pool. | F5Bot requires webhook setup or JSON import; Google Alerts/search requires CSV or JSON import. Human review remains required before action. |
The local hub uses a staged pipeline:
hub/data/hub.db stores collection results and provenance. It is generated state and must not be hand-edited.
hub/registry/ defines brands, terms, and routing rules. Human-editable intelligence records live in the project-root items/ folder.
Reporting writes versioned weekly briefs and hub/dashboard/data/hub.json. The browser reads that JSON and renders the dashboard locally.
data/hub.json; opening index.html directly from file:// will not work reliably.From the project root, serve the dashboard directory with a local HTTP server, then open the printed address:
cd hub
../hub/venv/bin/python -m http.server 8777 --directory dashboard
The static deployment path uses hub/dashboard as the output directory and no build command. The page and this readme use SHA-256 query strings for style.css, app.js, and readme.js. After changing one of those files, recalculate the hashes and update both HTML pages:
sha256sum hub/dashboard/style.css hub/dashboard/app.js hub/dashboard/readme.js
Cloudflare Pages and Cloudflare Access are off-site operational steps. The repository and dashboard contain internal findings and source evidence, so the hosted site must remain private and protected before it is shared.