Move theme toggle from legend to header as "Light Mode"/"Dark Mode"
button visible on both desktop and mobile. Add "Notes" button in
header (desktop only; mobile keeps floating pill). Legend and notes
content now load into a 400px slide-in side panel on desktop, matching
the full-screen mobile overlay. Escape key closes notes panel.
Co-Authored-By: Paperclip <noreply@paperclip.ing>
Adjust the SVG viewBox on mobile to match the actual rendered aspect
ratio instead of the fixed 1280x800 landscape ratio. The previous
implementation computed the zoom scale against the viewBox dimensions,
but on a tall/narrow mobile screen with min-height: 60vh the SVG
element is much taller than the viewBox maps to with xMidYMid meet.
By stretching the viewBox to match the real element proportions, the
tree's vertical extent now has proper headroom and the initial zoom
fills the viewport as expected.
Co-Authored-By: Paperclip <noreply@paperclip.ing>
On screens ≤768px, pre-compute the bounding box of the collapsed
tree layout and apply a zoom transform so the root + top-level
categories fill the viewport immediately, instead of starting tiny
in the center.
Also adds a reusable zoomToFill() utility for future reset-view use.
Co-Authored-By: Paperclip <noreply@paperclip.ing>
- Use position:absolute for theme toggle so title centers naturally
- Reduce search bar padding on mobile for more vertical space
- Add min-height: 60vh on SVG to ensure tree fills viewport
- Desktop layout unchanged
Co-Authored-By: Paperclip <noreply@paperclip.ing>
On mobile (<=768px), the legend, notes, and about sections consumed most
of the viewport, leaving the D3 tree nearly unusable. This moves the
theme toggle into the header as a compact "Light Mode"/"Dark Mode"
button, hides the below-tree content, and adds a floating "Notes"
button that opens all that content in a full-screen overlay panel
(matching the existing tool detail panel pattern). Desktop layout
is completely unchanged.
Co-Authored-By: Paperclip <noreply@paperclip.ing>
The panel overlay (z-index 199) was intercepting all clicks on the tree
when the panel was open, forcing users to close the panel before selecting
a different tool. Setting pointer-events: none on the overlay lets clicks
pass through to tree nodes, where openPanel() already handles replacing
the panel content. The SVG background click handler still closes the panel
when clicking empty canvas.
Co-Authored-By: Paperclip <noreply@paperclip.ing>
Adds a region badge that always shows in the tool details panel.
Defaults to "Global" when the region field is absent or set to "global".
Accepts a two-letter country code string (uppercased) or an array of
country codes (joined as "US, UK"). Badge is styled green (#2e7d32).
Co-Authored-By: Paperclip <noreply@paperclip.ing>
Show boolean feature badges in the tool details panel when true:
- API (blue): tool has a public API
- Invite Only (amber): tool requires an invitation
- Deprecated (dark red): tool is no longer actively maintained
Co-Authored-By: Paperclip <noreply@paperclip.ing>
- Breadcrumb now sits below the tool name inside panel-header, wrapped
in #panel-header-text flex column; removes the need for the first HR
divider between breadcrumb and the CTA button
- #panel-open-tool changed from block/width:100% to inline-block with
auto width; #panel-cta-section centered with text-align so the button
is pill-sized and no longer overflows the panel
Co-Authored-By: Paperclip <noreply@paperclip.ing>
Move Open Tool button to top (below breadcrumb), add HR dividers,
split Input→Output into its own section separate from Usage Context,
and rename Rating label to Community Rating.
Co-Authored-By: Paperclip <noreply@paperclip.ing>
Remove redundant top-level Terrorism category. All content is already
present under Threat Intelligence > Terrorism & Extremism (added via
THE-41), with updated URLs from the research expansion. No data is lost.
Co-Authored-By: Paperclip <noreply@paperclip.ing>
Backend (src/worker.js):
- Add POST /api/vote: upvote/downvote with toggle behavior, one vote per
session per tool, returns net score
- Add POST /api/report: flag tools as dead_link/paywalled/incorrect_info;
auto-creates GitHub issue via GitHub API when REPORT_THRESHOLD (3) unique
reports of the same type are received (requires GITHUB_TOKEN secret)
- Update GET /api/tool-stats to include votes { up, down, score }
- Extract validateCommon() and isRateLimited() helpers to reduce duplication
Frontend (public/js/arf.js):
- Replace static rating placeholder with _renderVoteUI(): renders thumbs
up/down buttons, reads cached vote from sessionStorage, fetches live score
async from /api/tool-stats
- Add _castVote(): fires POST /api/vote, updates button active state and
score display, persists user vote in sessionStorage
- Add _resetReportButtons() and _submitReport(): wire report buttons per
panel open, POST /api/report, show inline feedback message
HTML (public/index.html):
- Replace static rating span with vote row (thumbs up, score, thumbs down)
- Replace static GitHub report link with three report buttons + feedback div
CSS (public/css/panel.css):
- Add .vote-btn, .vote-score (.positive/.negative/.zero) styles
- Add .report-btn, .panel-report-feedback styles
- Remove old #panel-report-link styles (replaced by button row)
Co-Authored-By: Paperclip <noreply@paperclip.ing>
Populate enrichment fields for all 17 tools in the Username category
(Username Search Engines + Specific Sites). Each tool now includes
description, status, pricing, bestFor, input/output, opsec rating,
and badge flags (localInstall, googleDork, registration, editUrl,
api, invitationOnly, deprecated).
All URLs verified as live on 2026-03-26.
Co-Authored-By: Paperclip <noreply@paperclip.ing>
The osint_framework_kv namespace ID was truncated to "cdb975e31e"
in the initial commit. Updated to the full 32-character ID confirmed
by the board from the Cloudflare dashboard.
Co-Authored-By: Paperclip <noreply@paperclip.ing>
Add description, status, pricing, bestFor, input/output, opsec, and
opsecNote fields for: Maltego, theHarvester, SpiderFoot, Recon-ng,
Censys, BuiltWith, Have I Been Pwned, VirusTotal, and Wayback Machine.
Shodan was already enriched in THE-107. Tools appearing in multiple
categories are enriched at each location (13 entries total).
Co-Authored-By: Paperclip <noreply@paperclip.ing>
- src/worker.js: Cloudflare Worker entry point handling POST /api/track
and GET /api/tool-stats, falling through to ASSETS for static files
- wrangler.jsonc: wire main entry point + CLICK_DATA KV binding
(namespace: osint_framework_kv, id: cdb975e31e)
- public/js/arf.js: fire sendBeacon to /api/track on Open Tool click
Privacy: no IPs stored, no cookies, client-generated session_hash only.
Dedup: one counted click per session per tool (1-hour TTL).
Rate limit: 60 req/min per session_hash (2-min TTL key).
Co-Authored-By: Paperclip <noreply@paperclip.ing>
Board confirmed: mobile panel should be full-screen overlay with X button,
not a bottom sheet. Simplified @media breakpoint to 100vw/100vh with no
border-radius and inherited slide-right animation from desktop.
Co-Authored-By: Paperclip <noreply@paperclip.ing>
- Status (live/down/degraded/unknown) and pricing (free/freemium/paid/unknown)
pill badges always shown in panel badges row with semantic colors
- OPSEC section now renders colored badge (passive/active/unknown) + opsecNote text
- Description section always visible; shows italic placeholder when no data
- Usage context renders bestFor and input→output mapping; hidden when all empty
- CTA button label now shows "Open [Tool Name] ↗" with actual tool name
- Added badge pill CSS (.badge-live, .badge-down, etc.) to panel.css
- Seeded Shodan (Discovery subcategory) with all new enrichment fields as demo
Co-Authored-By: Paperclip <noreply@paperclip.ing>
Apply remaining redirect URL updates in arf.json where the destination
is stable and safe. Skips redirects to login pages, parked domains,
and cross-domain redirects that need manual review.
Co-Authored-By: Paperclip <noreply@paperclip.ing>