# Felyri Consulting ## Purpose & users Public website for Felyri Consulting Limited, a small UK-based policy and geopolitical risk consultancy. Intended for prospective clients exploring its services and approach. ## Scope Four editorial brochure pages plus an international News page, with shared navigation and footer. No accounts, submissions or stored client data. Contact page displays owner-supplied business contact details. News displays stored public headlines retrieved independently of visitors, focused on geopolitics, conflict, military affairs, technology and the economy, with explicit entertainment exclusions. ## Tech stack Vue 3 and Vue Router 4, browser-runtime compilation. Lucide icons. Lora headings and Inter body font families. GDELT DOC public news API via a server-only scheduled App Action. Lazy fliplet-datasources for browser cache reads and server writes. ## Architecture Public route manifest, platform-conditional history routing. Shared navigation/footer loaded through the shared component registry. No authentication. Automatic page views and custom events on core service/enquiry navigation CTAs. News reads the latest snapshot from Felyri News Cache; browser opens and half-hourly checks read stored data, not GDELT or an App Action. It preserves loaded headlines on read failure and flags retrievals over an hour old. Retrieval timestamp and explicitly Indexed dates distinguish indexing from publication. Enabled server action felyri-news-cache-refresh runs every 30 minutes in Europe/London and permits manual queued runs. It uses a compact five-subject English-language GDELT query with entertainment exclusions, overfetches up to 100 entries and writes at most 24 public title/HTTPS URL/domain/seenAt entries as one JSON snapshot to the preseeded latest row. Both refresh action and News display reject explicit entertainment titles and deduplicate exact titles after NFKC, case, punctuation/symbol and whitespace normalization, in addition to URL deduplication. These are keyword guards, not semantic classification or fact-checking. Broad publisher coverage remains; no whitelist was requested. Invalid, empty or failed results retain the last good snapshot. No credentials or private data are involved. The action remains master-only deliberately: publishing would create a second schedule. Original enabled, published manual felyri-international-news remains unchanged but News no longer invokes it. ## Screens | Screen | Route | Purpose | Data sources | |---|---|---|---| | Home | / and /home | Introduce firm and two expertise areas | None | | Expertise | /expertise | Describe policy and geopolitical risk services | None | | About | /about | Explain decision-led analytical approach | None | | Contact | /contact | Explain engagement considerations and display business email and address | None | | News | /news | Linked third-party international headlines with publisher attribution and indexing metadata | Felyri News Cache | ## Code organization Source under src, with screens, shared components and global styles separated. Home retains the original Foundation.vue filename. App.js initialises shared styles and component loading. Single-root screen templates, readable source and purpose comments. News.vue owns read-only snapshot loading, display sanitization and timer cleanup; SiteNav contains five shared links including News. ## Design language Think-tank-inspired editorial composition, not a direct Stimson reproduction. Off-white #f7f6f2, navy #142738, burgundy #7b273b; Lora/Inter pairing; square edges, fine rules, spacious asymmetric sections. Solid text surfaces and contextual London photography. Desktop top navigation and mobile bottom navigation. British English. News retains its text-led grid; the requested review found no definite desktop layout defect, so only its introduction changed. ## Data sources Felyri News Cache stores one public snapshot with Key='latest', Articles as a JSON string of sanitized public metadata, and Fetched At as successful retrieval ISO time. Everyone has select permission; app-user insert/update/delete are not granted. Server tasks write with platform task privileges. A known preseeded row is updated, never appended on refresh. No user credentials or client information is stored. Administrative inspection and Studio-authenticated reads do not establish signed-out browser authorization. ## Decisions log - 2026-11-11: Owner confirmed Stimson Center as inspiration, not the lumber business. No detailed reference inspection was completed; design follows the approved think-tank direction. - 2026-11-11: Used only supplied business facts and proposed service positioning; omitted unverified staff, client logos, track record and published research. - 2026-11-11: Omitted enquiry submission and invented email addresses because no genuine contact destination was supplied. Contact explicitly states direct details are not yet available. - 2026-11-11: Implemented as a single read-only brochure layer; no backend or account system is needed for approved scope. - 2026-11-11: Owner supplied public business email adriase.jones@felyri.com and company address 2 Waterside Castle Combe, Chippenham, England, SN14 7HX. Added both to Contact with a mailto link; no phone or registered-office claim was added. Preview evidence confirmed displayed address and exact mailto destination. - 2026-11-12: Owner authorised GDELT public news retrieval via the website, creation/testing of the server connection and conditional News page. No scheduled work or storage was authorised. - 2026-11-12: Live server calls retrieved 23 sanitized articles, but provider rate limiting and a browser invocation timeout prevented UI population. One bounded server retry succeeded after about 44 seconds while the browser request timed out at about 30 seconds. Kept News out of navigation rather than present the feed as working. Preserved the unfinished page and enabled manual action for continuation. - 2026-11-12: A transient Unpkg loading failure interrupted later preview checks; a fresh home reload recovered Vue/Vue Router and the original navigation with no source/dependency changes. - 2026-11-12: Owner approved storing headlines and refresh every 30 minutes. Implemented a public read-only cache and separate enabled master-only refresh action, preserving the original published manual action and avoiding duplicate master/production schedules. - 2026-11-12: A queued on-demand refresh completed in about 46 seconds and saved 24 genuine headlines at 02:02:43 UTC. Preview displayed the persisted snapshot on reload and refresh; News was then added to shared navigation. The first scheduled refresh is due at 02:30 UTC and was not yet observed by 02:09 UTC. - 2026-11-12: Isolated token-free REST requests stopped at platform authentication, so they did not verify anonymous data-source rule behaviour. A temporary harmless probe was removed and the latest snapshot remained unchanged. Security-on preview mode remained true throughout. - 2026-11-12: Owner approved focused geopolitics, conflict, military affairs, technology and economy coverage, excluding entertainment and reducing exact duplicate headlines. Preserved broad English-language publisher coverage, half-hour schedule and existing design. Expanded provider query was rejected as too long; replaced with compact 204-character query after inspecting actual public provider error, retaining local entertainment guards. Final live retest hit HTTP 429, preserving the last successful 02:02:43 UTC snapshot; acceptance of the compact query remains unverified. - 2026-11-12: Applied the same explicit-entertainment and normalized-title filters when displaying cached headlines so existing snapshots benefit immediately. Final News render showed 13 articles and the updated introduction without console errors. Executed actual saved sanitizer on 11 synthetic records: retained all five topical examples, rejected entertainment and unsafe links, collapsed Unicode/case/punctuation title duplicates and duplicate URLs, yielding five valid entries. Synthetic records were never written to storage. ## Known gaps - Compact five-subject query has not yet completed a successful live retrieval because the final retest was rate-limited. Stored data remains the previous good snapshot; displayed exclusions/deduplication are active and tested. - Keyword entertainment exclusion is best-effort; it does not guarantee semantic topic classification, balanced coverage, cross-publisher story clustering or factual accuracy. - Half-hourly schedule configuration is saved and enabled, but only queued on-demand execution has been observed; actual scheduled execution remains unverified. - Signed-out production cache reads and write-denial enforcement remain unverified. Studio-authenticated security-on reads and token-free REST 401s are not anonymous rule tests. - Overlapping refreshes are repeat-safe for row count; timestamp comparison lacks an atomic transaction, leaving a small older-result race risk. - Read-failure retention, elapsed stale warnings and half-hour browser timer are implemented but not runtime-exercised under forced failure/time progression. - Phone viewport and screenshot appearance remain unverified; no unsupported new design scores assigned. - Original manual retrieval action is retained and published but unused by News; it has no schedule. - Email link opens the visitor's email application; no enquiry submission service is included. - Stock photography is used; the same photo is repeated across some inner pages. - All five distinct pages rendered without console errors after shared navigation changes. News showed real publisher links and indexing metadata; reload retention, refresh interaction and News/Home/back navigation were exercised. Contact email and address were observed. - Custom analytics calls were observed firing; event persistence was not independently checked. - Historical brochure design review scores: hierarchy 5, typography 4, colour 5, layout 4, content 4.