Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
27 commits
Select commit Hold shift + click to select a range
37673b1
feat: add public Discover feed site
k2kirov Sep 1, 2026
7b6c9d5
fix: add site favicon
k2kirov Sep 1, 2026
4898c3c
feat(discover): add v2 content engine
k2kirov Sep 1, 2026
f3d9e04
no-mistakes(review): Complete v2 feed cutover and validation
k2kirov Sep 1, 2026
ad2c6ad
no-mistakes(review): Align browser text limits with Zod
k2kirov Sep 1, 2026
634f75e
no-mistakes(review): Align Discover design docs with shipped v2 flow
k2kirov Sep 1, 2026
c5a0057
no-mistakes(review): Align v2 limits and add public README
k2kirov Sep 1, 2026
96ec594
no-mistakes(review): Align Unicode and whitespace feed contracts
k2kirov Sep 1, 2026
668ea28
no-mistakes(review): Align lowercase HTTPS validation across feed con…
k2kirov Sep 1, 2026
b5ea699
no-mistakes(review): Add bundled font license notices
k2kirov Sep 1, 2026
92e77e3
no-mistakes(review): Restrict deploys and improve action contrast
k2kirov Sep 1, 2026
aa9d930
no-mistakes(review): Align URL whitespace validation and card wrapping
k2kirov Sep 1, 2026
7ba95bc
no-mistakes(review): Align RFC URLs and add computed browser tests
k2kirov Sep 1, 2026
32ae515
no-mistakes(review): Validate RFC 3986 HTTPS authorities consistently
k2kirov Sep 1, 2026
c5aff9e
no-mistakes(review): Align web host validation across feed contracts
k2kirov Sep 1, 2026
2b506cb
no-mistakes(review): Reject ACE labels across HTTPS feed contracts
k2kirov Sep 1, 2026
3888495
no-mistakes(review): Enforce strict ends across feed contracts
k2kirov Sep 1, 2026
2f209b4
no-mistakes(review): Align strict date-time validation and repair fix…
k2kirov Sep 1, 2026
b8be799
no-mistakes(review): Add resilient Scalar loading fallback
k2kirov Sep 1, 2026
d79c073
no-mistakes(test): Restore legacy live feed rendering compatibility
k2kirov Sep 1, 2026
b0bbd9c
no-mistakes(document): Refresh Discover feed documentation
k2kirov Sep 1, 2026
971cc4e
revert(discover): keep feeds v2-only
k2kirov Sep 1, 2026
fd3a37c
no-mistakes(review): Announce empty and failed feed states
k2kirov Sep 1, 2026
1173244
no-mistakes(review): Enforce v2 feeds and add local source registry
k2kirov Sep 1, 2026
2b1ecd9
no-mistakes(review): Add premerge CI and unblock feed rendering
k2kirov Sep 1, 2026
69214b4
no-mistakes(review): Separate workflow concurrency by event
k2kirov Sep 1, 2026
52d5bc9
no-mistakes(document): Consolidate Discover source documentation
k2kirov Sep 1, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
80 changes: 80 additions & 0 deletions .github/workflows/pages.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
name: Validate and deploy Discover site

on:
push:
branches:
- main
pull_request:
branches:
- main
workflow_dispatch:

permissions:
contents: read

concurrency:
group: discover-${{ github.event_name }}-${{ github.ref }}
cancel-in-progress: true

jobs:
validate:
runs-on: ubuntu-latest
steps:
- name: Check out repository
uses: actions/checkout@v6

- name: Set up Node.js
uses: actions/setup-node@v6
with:
node-version: 24
cache: npm

- name: Install test packages
run: npm ci

- name: Generate schema references
run: |
npm run write:schema
npm run write:openapi

- name: Test feed and page code
run: npm test

- name: Type-check schema code
run: npm run typecheck

- name: Validate public feeds
run: npm run validate:feed -- feed-live.json feed-dev.json

- name: Validate public source registry
run: npm run validate:sources

- name: Prepare static site
run: |
mkdir _site
cp index.html schema.html openapi.json feed.schema.json sources.json CNAME .nojekyll feed-live.json feed-dev.json _site/
cp -R assets _site/assets

- name: Upload GitHub Pages artifact
uses: actions/upload-pages-artifact@v4
with:
path: _site

deploy:
if: ${{ github.event_name == 'push' && github.ref == 'refs/heads/main' }}
needs: validate
permissions:
contents: read
pages: write
id-token: write
environment:
name: github-pages
url: ${{ steps.deployment.outputs.page_url }}
runs-on: ubuntu-latest
steps:
- name: Configure GitHub Pages
uses: actions/configure-pages@v5

- name: Deploy GitHub Pages artifact
id: deployment
uses: actions/deploy-pages@v4
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
node_modules/
.DS_Store
Empty file added .nojekyll
Empty file.
1 change: 1 addition & 0 deletions CNAME
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
discover.dwithease.com
52 changes: 52 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
# DWithEase Discover

DWithEase Discover is the DWithEase news engine for ecommerce and Salesforce B2C Commerce (SFCC) updates. It brings commerce news, technical articles, release notes, and useful tools into one light public page.

## Public links

- [Discover](https://discover.dwithease.com/)
- [Live v2 feed](https://discover.dwithease.com/feed-live.json)
- [Development v2 feed](https://discover.dwithease.com/feed-dev.json)
- [Interactive API reference](https://discover.dwithease.com/schema.html)
- [JSON Schema](https://discover.dwithease.com/feed.schema.json)
- [OpenAPI document](https://discover.dwithease.com/openapi.json)
- [Source registry](https://discover.dwithease.com/sources.json)
- [DWithEase](https://dwithease.com/)

## Editorial sources

See [SOURCES.md](SOURCES.md) for the full source list and curation rules.

## Feed v2

Both public endpoints use the v2 JSON format:

```json
{
"version": 2,
"locale": "en",
"updatedAt": "2026-09-01T12:00:00Z",
"items": []
}
```

Each item has a stable slug ID, a type, an HTTPS URL, source details, a publication date, tags, and a CTA. Editorial items use `article` or `news`. Promotions also include a dated campaign and one or more placements.

The development feed contains the curation corpus. The live feed remains empty until that corpus is approved. Validate both files before publication:

```sh
npm run validate:feed -- feed-live.json feed-dev.json
```

## UX authoring guidance

Use the preferred length when possible. The raw maximum counts the original JSON string before trimming.

| Field | Preferred length | Raw maximum |
| --- | ---: | ---: |
| Title | 70 characters | 120 characters |
| Summary | 150 characters | 280 characters |
| CTA label | 24 characters | 32 characters |
| Image alt text | 100 characters | 160 characters |

The page does not clamp text. Write complete copy that fits within these limits.
48 changes: 48 additions & 0 deletions SOURCES.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
# Discover feed sources

This file records the inputs for `feed-dev.json`.

`sources.json` maps each canonical source URL to a checked-in icon under `assets/sources/`. The page uses the local fallback icon when a feed source has no exact URL match.

## Curation rules

- Fetch public HTML, RSS, or Atom with a normal HTTP request.
- Use small regular expressions to read titles, links, dates, and summaries.
- Keep up to 5 recent commerce items from each editorial source.
- Keep links to source pages. Do not copy full article text.
- Remove duplicate URLs and duplicate item IDs.
- Sort editorial items by `publishedAt`, newest first.
- Review every item before it moves to `feed-live.json`.

## Editorial sources

| Source | Source URL | Method | Cycle result on 2026-09-01 |
| --- | --- | --- | --- |
| Salesforce News | https://www.salesforce.com/news/topics/commerce/ | HTML | Working. The old `/stories/category/commerce/feed/` URL returned HTTP 404. The HTML topic page is the fallback. |
| Salesforce Commerce Blog | https://www.salesforce.com/blog/category/ecommerce/ | HTML or RSS | Working. The commerce RSS feed also returned HTTP 200. |
| Salesforce Developers Blog | https://developer.salesforce.com/blogs/feed | RSS | Working. Apply an SFCC, B2C Commerce, PWA Kit, or composable storefront term filter. |
| PWA Kit Releases | https://github.com/SalesforceCommerceCloud/pwa-kit/releases.atom | Atom | Working. The current Atom window contains nightly builds. The dev feed keeps 1 nightly item for testing. Exclude nightly builds from live curation unless they add useful release detail. |
| Rhino Inquisitor | https://rhino-inquisitor.com/archive/ | HTML | Working. `/feed/` returned a small HTML page instead of a usable XML feed. Use the archive page. |
| Agentic Storefront | https://agenticstorefront.com/categories/agentic-commerce/ | HTML | Working. |
| ForkPoint | https://forkpoint.com/articles/ | HTML | Working. Article pages do not expose a reliable publication date. The dev feed uses the shared HTTP `Last-Modified` date as a temporary value. Set real dates before live use. |
| Salesforce Ben | https://www.salesforceben.com/category/commerce/ | HTML | Partial. The category page shell does not expose a full item list in the first HTML response. Use commerce search results and article pages as the fallback. |
| Digital Commerce 360 | https://www.digitalcommerce360.com/topic/technology/ | HTML | Working. Apply ecommerce, agentic commerce, storefront, search, retail, or platform term filters. |

## Product sources

| Product | URL | Feed use |
| --- | --- | --- |
| Agentic Storefront Audit | https://audit.agenticstorefront.com/ | Promotion |
| CatalogSpark | https://catalogspark.com/ | Promotion |
| RetailPace | https://retailpace.com/ | Promotion |
| IntentFusion | https://intentfusion.com/ | Promotion |

## Current dev corpus

`feed-dev.json` contains:

- 38 editorial items.
- 4 promotion items.
- 42 items in total.

`feed-live.json` remains a valid empty v2 feed during dev curation.
Binary file added assets/discover-fallback.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Loading