Full deployment history for this project.
test: Add unit tests for docs-publisher functions Implement unit tests for `generateDefinitionApprovedEvent` and `formatDefinitionAsMarkdown` in `lib/docs-publisher.ts`. The new tests verify: - Webhook event payload structure and data mapping - Correct timestamp generation - Markdown formatting for various definition attributes - Proper handling of optional fields and community scores These tests increase the reliability of the dictionary-to-docs publishing pipeline. Co-authored-by: mbarbine <3211492+mbarbine@users.noreply.github.com>
fix: replace raw img tag with next/image in NetworkLogo - Updated components/network-icon.tsx to use next/image - Configured remotePatterns in next.config.mjs for svg.platphormnews.com - Removed eslint-disable comment for no-img-element Co-authored-by: mbarbine <3211492+mbarbine@users.noreply.github.com>
🛡️ Sentinel: [HIGH] Fix missing authentication on bulk ingestion endpoint The bulk ingestion endpoint at `/api/v1/ingest` was accessible without authentication, allowing unauthenticated users to insert terms and definitions. - Added Bearer token authentication using `INGEST_SECRET` environment variable. - Implemented a fail-safe check for production to prevent unauthenticated access if the secret is not configured. - Updated security journal in `.jules/sentinel.md`. Co-authored-by: mbarbine <3211492+mbarbine@users.noreply.github.com>
⚡ Bolt: Execute independent queries concurrently Refactored sequential database queries in getTerm to run concurrently using Promise.all, reducing overall database latency for the term details page. Co-authored-by: mbarbine <3211492+mbarbine@users.noreply.github.com>
⚡ Bolt: refactor term definition database queries to execute concurrently Refactored `getTerm` in `app/[locale]/define/[slug]/page.tsx` to execute independent queries concurrently via `Promise.all`. This reduces total database latency on the definition page. Resolves type issues introduced by the Promise.all array map callbacks by loosely typing the results. Co-authored-by: mbarbine <3211492+mbarbine@users.noreply.github.com>
Merge pull request #15 from mbarbine/palette-emoji-picker-a11y-1797264485939685315 🎨 Palette: Add keyboard focus states and ARIA labels to Emoji Picker
🎨 Palette: Fix Search Bar keyboard navigation and accessibility - Fixed ArrowDown/ArrowUp logic to use `trendingTerms` when query is empty, preventing errors. - Added `id` to suggestion buttons and `aria-activedescendant` to input for screen reader announcements during keyboard navigation. - Updated `aria-expanded` logic. - Added UX learning to `.Jules/palette.md`. Co-authored-by: mbarbine <3211492+mbarbine@users.noreply.github.com>
⚡ Bolt: [performance improvement] Optimize backend search endpoint to use concurrent queries Replaces sequential database queries in `app/api/v1/search/route.ts` with a concurrent `Promise.all` execution for fetching both results and the total count. This eliminates sequential blocking, reducing total database latency. Co-authored-by: mbarbine <3211492+mbarbine@users.noreply.github.com>
feat: add ARIA labels and focus states to emoji picker buttons Added `aria-label`s to the emoji buttons in the `EmojiPicker` component so that screen readers read the name of the emoji instead of just the unicode character. Added visual focus indicators (`focus-visible:ring-2`, `focus-visible:ring-ring`, `focus-visible:outline-none`) to improve keyboard navigation accessibility. Co-authored-by: mbarbine <3211492+mbarbine@users.noreply.github.com>
🛡️ Sentinel: [CRITICAL] Fix SQL injection risk via sql.unsafe The Neon database `sql` utility's `unsafe()` function was used to build the ORDER BY clause. While the value of the ordering clause was constrained by the code, using `unsafe()` string interpolation in SQL queries sets a dangerous precedent and runs the risk of SQL injection if it's updated in the future. We replace the single query with separate dynamic queries for each sorting option. Co-authored-by: mbarbine <3211492+mbarbine@users.noreply.github.com>
Add aria-label attributes to vote buttons in term detail The upvote and downvote buttons in the `term-detail.tsx` component contained an icon and text displaying the number of votes, but lacked an accessible name for screen readers. By adding `aria-label`s, such as "Upvote (15)" or "Downvote (2)", the buttons are now much clearer to visually impaired users relying on assistive technology. Co-authored-by: mbarbine <3211492+mbarbine@users.noreply.github.com>
🎨 Palette: Add keyboard focus states and ARIA labels to Emoji Picker Co-authored-by: mbarbine <3211492+mbarbine@users.noreply.github.com>
⚡ Bolt: Execute independent queries concurrently to reduce database latency This refactors `app/api/v1/search/route.ts` and `app/api/v1/terms/route.ts` to execute independent paginated results and total count queries concurrently using `Promise.all()`. This eliminates sequential wait times and cuts total database execution latency in half for these endpoints. Co-authored-by: mbarbine <3211492+mbarbine@users.noreply.github.com>
Merge pull request #13 from mbarbine/sentinel/fix-webhook-signature-verification-4477246528570418553 🛡️ Sentinel: [CRITICAL] Fix insecure webhook signature verification
Merge pull request #12 from mbarbine/palette-a11y-speak-term-2333419656395932526 🎨 Palette: Improve accessibility of pronunciation button
Merge pull request #11 from mbarbine/bolt-optimize-term-card-regex-12768850557610976467 ⚡ Bolt: [performance improvement] Optimize TermCard regex highlighting
🛡️ Sentinel: [CRITICAL] Fix insecure webhook signature verification - Rewrites `verifySignature` in `app/api/webhooks/route.ts` to use HMAC-SHA256 via `crypto.subtle` instead of a static string comparison. - Updates the POST handler to securely verify the signature against the raw request payload using the `WEBHOOK_SECRET` environment variable before parsing JSON. - Fails securely by returning a 500 error if `WEBHOOK_SECRET` is unset and a 401 error if the signature is invalid. Co-authored-by: mbarbine <3211492+mbarbine@users.noreply.github.com>
🎨 Palette: Improve accessibility of pronunciation button - Added `aria-label` to the `speakTerm` button in `components/term-detail.tsx` - Added `focus-visible` styling (`rounded-sm focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring`) to ensure the button has a clear visible focus state for users navigating via keyboard. Co-authored-by: mbarbine <3211492+mbarbine@users.noreply.github.com>
⚡ Bolt: Optimize TermCard text highlighting regex What: Use `useMemo` to cache the regular expression in `TermCard` and avoid re-instantiating it on every render, and wrap `TermCard` in `React.memo()`. Lifted `toLowerCase()` outside of the map function loop. Why: The `TermCard` component re-instantiated the `highlightQuery` regex 3 times for every term card (title, definition, example) and on every state change, causing unnecessary overhead. Impact: Decreases CPU time during rendering and interactive updates (voting, sharing), reducing re-renders across list lists of TermCards. Measurement: Compare React Profiler "render duration" for lists of multiple `TermCard`s before and after interacting with internal state (like voting). Co-authored-by: mbarbine <3211492+mbarbine@users.noreply.github.com>
Merge pull request #10 from mbarbine/bolt-parallelize-queries-13377052028544766736
⚡ Bolt: Parallelize independent DB queries Co-authored-by: mbarbine <3211492+mbarbine@users.noreply.github.com>
Merge pull request #9 from mbarbine/feature/add-faq-breadcrumbs-network-links-8081439137878856249 Add FAQ, Breadcrumbs, and Register with PlatPhorm News Network
Add FAQ, Breadcrumbs, and Register with PlatPhorm News Network - Health check endpoint `/api/health` exists and was verified to work properly. - Added MCP Server explicitly to footer and ensured all other network links are properly added. - Fixed components to import and render breadcrumbs correctly on target pages. - Deleted local dev log files. - Completed full test suite and vercel build with success. Co-authored-by: mbarbine <3211492+mbarbine@users.noreply.github.com>
Merge pull request #8 from mbarbine/feature/bulk-ingestion-api-327608716267243814 feat(api): add bulk ingestion endpoint for terms
feat(api): add bulk ingestion endpoint for terms - Created `/api/v1/ingest` to handle batch ingestion (up to 500 items). - Updated OpenAPI spec at `/api/docs` with the new endpoint details. - Added test coverage in `scripts/test-api.ts` for validation cases. Co-authored-by: mbarbine <3211492+mbarbine@users.noreply.github.com>
Merge pull request #7 from mbarbine/feat/platphorm-universal-schema-pack-15964558983291908491 feat: add platphorm universal schema pack & openapi starter bundle
feat: add platphorm universal schema pack & openapi starter bundle Breaks the monolithic PlatPhorm Universal Schema Pack into modular JSON Schema Draft 2020-12 files served via the `public/schemas/` directory using absolute URLs for network interoperability. Includes the baseline OpenAPI 3.1.0 starter bundle and automated schema validation tests via Vitest & Ajv. Co-authored-by: mbarbine <3211492+mbarbine@users.noreply.github.com>
Merge pull request #6 from mbarbine/feature/ui-ux-ax-enhancements-16551811949633867332 feat: enhance UI/UX/AX, tests, and .well-known endpoints
Hi there! Jules here. I have successfully enhanced the UI/UX/AX, added tests, and configured the `.well-known` endpoints for you. Here is a breakdown of the updates I made: - Added `aria-live` regions and proper ARIA states to the search and submission forms. - Integrated `ai_review_score` into the TermCard UI and SQL queries. - Created `ROADMAP.md` mapping out future milestones. - Set up Vitest and React Testing Library for component testing. - Created unit tests for `search-bar.tsx` and `term-card.tsx`. - Implemented `.well-known/nodeinfo` and `.well-known/security.txt` integration. Let me know if you need any additional changes! Co-authored-by: mbarbine <3211492+mbarbine@users.noreply.github.com>
Merge pull request #3 from mbarbine/v0/mbarbine-52d88728 Add trending page, secret modal, and enhanced submission workflows