Local-first, AI-assisted eBay listing and inventory platform with a modular plugin ecosystem.
eBay Hero ingests photos, identifies items (trading cards, stamps, collectibles), reads text with OCR, prices from authorized sold comparables, builds listing drafts, validates them against eBay (sandbox by default), and exports eBay-safe CSVs β all against a local SQLite database.
It is also an ecosystem hub: vertical capabilities ship as isolated plugins (CardOps for trading cards, Stamplicity for philately) that mount onto the core through a small, entitlement-aware interface. Disabling or removing a plugin can never break the core.
- Project overview
- Architecture
- Feature matrix
- Quickstart
- Configuration
- Repository layout
- Plugin development
- API & workflow reference
- Interactive demo
- Testing & CI
- Safety defaults
- Documentation index
eBay Hero solves the whole "one item at a time" problem for high-volume resellers:
- Intake β scan one or more photo roots, hash, deduplicate, and index images.
- Identify β OCR labels, certs, and cards; extract structured metadata.
- Price β compute market value from verified and authorized sold evidence only.
- Draft β map inventory onto eBay Inventory/Offer payloads with reusable templates.
- Validate β audit drafts against listing rules before anything is published.
- Export / publish β produce eBay-safe CSVs, or publish via the REST API (opt-in).
- Extend β plug in vertical addons without touching core code.
The product is local-first: inventory, images, and the database stay on your machine. Live eBay publishing is disabled by default and must be explicitly enabled per account.
eBay Hero uses a hub-and-spoke model. The hub owns the eBay engine, persistence, and the entitlement controller. Spokes are plugins that declare capabilities, hooks, and routes β and are executed by an isolating host.
+---------------------------- eBay Hero (hub) -----------------------------+
| eBayHero.Core domain, entitlements, plugin runtime, eBay engine |
| eBayHero.Infrastructure EF Core + SQLite, migrations, legacy importers |
| eBayHero.FileSystem image scanning, hashing, safe file operations |
| eBayHero.Ocr local OCR, preprocessing, non-destructive edits |
| eBayHero.Export eBay-safe CSV/manifest export |
| eBayHero.App (WPF) Windows production shell |
| eBayHero.Web (Vite) companion surface |
| |
| [ Entitlements ] [ Plugin registry ] [ Plugin host (isolated) ] |
| [ eBay engine: OAuth 2.0 / Inventory / Fulfillment / Trading ] |
+------------^----------------------------^----------------------------^----+
| IEcosystemPlugin | |
+---------+---------+ +--------------+--------+ +--------+------+
| Plugins.CardOps | | Plugins.Stamplicity | | Plugins.AiSuite|
| cards + AI | | stamps + AI | | master AI unlock|
+-------------------+ +-----------------------+ +----------------+
Design rules
- Core never references a plugin project. Plugins reference Core.
- All gating flows through
IEntitlementService; business logic never checks a tier. - The plugin host wraps every plugin call, so a failing addon is isolated, not fatal.
- eBay field names live in mapping profiles, not in the domain model.
See docs/ARCHITECTURE.md and docs/adr/0003-plugin-runtime.md.
Legend: β included Β· π requires the tier/addon shown Β· β not applicable.
| Capability | Owner | Free | Pro | Plugin addon |
|---|---|---|---|---|
| Manual listing generation | Core | β | β | β |
| CSV import / export | Core | β | β | β |
| Manual inventory sync | Core | β | β | β |
| Standard draft creation | Core | β | β | β |
| Single account connection | Core | β | β | β |
| Continuous background sync | Core | β | π Pro | β |
| Multi-account routing | Core | β | π Pro | β |
| Auto-relisting | Core | β | π Pro | β |
| Automated repricing rules | Core | β | π Pro | β |
| Bulk API batch publishing | Core | β | π Pro | β |
| Card inventory schema | CardOps | β | β | β CardOps |
| Manual card detail entry | CardOps | β | β | β CardOps |
| Card export to eBay drafts | CardOps | β | β | β CardOps |
| AI card recognition / OCR | CardOps | β | π Pro | π CardOps Pro |
| Automated grading detection | CardOps | β | π Pro | π CardOps Pro |
| Automated comp pricing | CardOps | β | π Pro | π CardOps Pro |
| Automated attribute population | CardOps | β | π Pro | π CardOps Pro |
| Stamp catalog schema (Scott / SG) | Stamplicity | β | β | β Stamplicity |
| Manual image attachment | Stamplicity | β | β | β Stamplicity |
| Standard eBay draft staging | Stamplicity | β | β | β Stamplicity |
| AI philately visual identification | Stamplicity | β | π Pro | π Stamplicity Pro |
| Automated stamp valuation comps | Stamplicity | β | π Pro | π Stamplicity Pro |
| Stamp auto-listing | Stamplicity | β | π Pro | π Stamplicity Pro |
| AI vision / OCR / valuation everywhere | AI Suite | β | β | π All-in-One AI Suite |
The authoritative definition of every gate lives in code:
csharp/src/eBayHero.Core/Entitlements/FeatureKey.cs (FeatureCatalog). The demo mirrors
it in docs/demo/data.js, and docs/FEATURE-MATRIX.md expands it.
| Plan | Price (suggested) | Highlights |
|---|---|---|
| Free / local | $0 | manual listing, image intake, basic OCR, drafts, CSV export, one account, one plugin at a time |
| Pro | $19β$39 / mo | background sync, multi-account routing, auto-relisting, repricing, bulk API publishing, plugin AI |
| Business | $79β$199 / mo | multi-store, multi-user, cloud sync, scheduled automation, higher provider limits |
| Addons | per plugin | CardOps Pro, Stamplicity Pro, All-in-One AI Suite (unlocks AI everywhere) |
See MONETIZATION_PLAN.md.
- .NET SDK 8.0+
- Node.js 20+ (web companion and demo only)
- Optional: Tesseract OCR, an eBay developer keyset
cd csharp
dotnet restore eBayHero.sln
dotnet build eBayHero.sln -c Release --no-restore
dotnet test eBayHero.sln -c Release --no-buildThe WPF app (eBayHero.App) and its UI tests target net8.0-windows and only build on
Windows. On Linux/macOS, build the cross-platform projects:
dotnet build src/eBayHero.Core/eBayHero.Core.csproj -c Release
dotnet test tests/eBayHero.Plugins.Tests/eBayHero.Plugins.Tests.csproj -c ReleaseRedirect build output and the NuGet cache (recommended when C: is tight):
$env:EA_BUILD_ROOT = 'D:\WORK\BuildArtifacts\ebay-hero'
$env:NUGET_PACKAGES = 'D:\WORK\.nuget-packages'
dotnet restore .\csharp\eBayHero.sln --packages $env:NUGET_PACKAGESThe interactive demo is static β open docs/index.html, or serve it:
npx serve docs # then open the printed URL| Action | Double-click |
|---|---|
| Launch the app | Run-Demo.cmd |
| Run tests | Run-Tests.cmd |
| Build | Build-Project.cmd |
| Publish | Deploy-Windows.cmd |
| Control center | Open-ControlCenter.cmd |
Full walkthrough: docs/QUICKSTART.md.
Copy .env.example and fill in your eBay developer values. eBay Hero reads
these from the environment (or from the in-app settings panel, which stores secrets through
the platform secret store).
| Variable | Purpose | Example |
|---|---|---|
EBAY_ENVIRONMENT |
sandbox or production |
sandbox |
EBAY_MARKETPLACE_ID |
eBay marketplace | EBAY_US |
EBAY_CLIENT_ID |
App ID | MyApp-xxxx-... |
EBAY_CLIENT_SECRET |
Cert ID | SBX-xxxx... |
EBAY_REFRESH_TOKEN |
Long-lived user token | v^1.1#... |
EBAY_RUNAME |
Redirect name (redirect_uri) | My_Name-MyApp-SBX-abc |
EBAY_REDIRECT_URI |
Local loopback callback | http://127.0.0.1:49152/callback |
EH_LICENSE_KEY |
Optional signed license key | EH1.... |
EH_LICENSE_SECRET |
Secret used to verify license keys | (server-side only) |
EH_ADDONS |
Comma-separated enabled addons | cardops,stamplicity |
Never commit
.env, refresh tokens, or license secrets. They are gitignored.
csharp/
src/eBayHero.Core domain, entitlements, plugins, eBay engine
src/eBayHero.Infrastructure EF Core + SQLite, migrations, importers
src/eBayHero.FileSystem scanning, hashing, file ops
src/eBayHero.Ocr OCR + image preprocessing
src/eBayHero.Export eBay-safe export
src/eBayHero.App Windows WPF shell
src/eBayHero.Web Vite companion surface
src/eBayHero.Plugins.CardOps first-party plugin
src/eBayHero.Plugins.Stamplicity first-party plugin
src/eBayHero.Plugins.AiSuite first-party plugin
tests/ xUnit test projects (Core, Infrastructure, Integration, Plugins, UI)
docs/ documentation + GitHub Pages demo
demo/ demo assets (data.js, app.js, styles.css)
Other language folders (python/, nodejs/, java/, go/) are reserved build-outs.
A plugin implements one small interface:
public interface IEcosystemPlugin
{
string Id { get; }
string Name { get; }
string Version { get; }
PluginTier Tier { get; }
IReadOnlyList<PluginCapability> Capabilities { get; }
IReadOnlyList<PluginHook> Hooks { get; }
IReadOnlyList<PluginRoute> Routes { get; }
ValueTask InitializeAsync(PluginContext context, CancellationToken cancellationToken = default);
ValueTask<PluginHookResult> OnHookAsync(PluginHookContext context, CancellationToken cancellationToken = default);
ValueTask<PluginRouteResult> InvokeRouteAsync(PluginRouteContext context, CancellationToken cancellationToken = default);
}Derive from EcosystemPluginBase, declare capabilities with an optional FeatureKey, and
register with the host:
var registry = new PluginRegistry(entitlements);
registry.Register(new CardOpsPlugin());
var host = new PluginHost(registry, entitlements);
await host.InitializeAsync();
var outcomes = await host.DispatchHookAsync("inventory.item.created", payload);Rules of the road:
- Declare a
FeatureKeyon any premium capability; never hardcode a paywall. - Return
PluginHookResult.Ignoredfor hooks you don't handle. - Treat the manifest (
PluginManifest.json, schema v1) as the discovery contract.
Full guide: docs/PLUGIN-DEVELOPMENT.md.
- Supported eBay endpoints, scopes, and REST/Trading routing rules: docs/API-REFERENCE.md
- Configuration parameters and field mapping: docs/API-REFERENCE.md
- Core workflows (intake β identify β price β draft β audit β export): docs/ARCHITECTURE.md
A dependency-free demo of the entitlement + plugin model lives in docs/
and deploys to GitHub Pages:
https://940smiley.github.io/eBay-Hero/
It includes mock tier toggles, plugin toggles, an eBay connection test, bulk draft creation, card OCR and stamp cataloging previews, and a getting-started wizard.
cd csharp
dotnet test tests/eBayHero.Core.Tests/eBayHero.Core.Tests.csproj -c Release
dotnet test tests/eBayHero.Infrastructure.Tests/eBayHero.Infrastructure.Tests.csproj -c Release
dotnet test tests/eBayHero.IntegrationTests/eBayHero.IntegrationTests.csproj -c Release
dotnet test tests/eBayHero.Plugins.Tests/eBayHero.Plugins.Tests.csproj -c Release| Suite | Covers |
|---|---|
| Core.Tests | domain services, pricing, listing audit |
| Infrastructure.Tests | SQLite migrations, legacy + CardOps importers, DateTimeOffset queries |
| IntegrationTests | export and image-processing end-to-end |
| Plugins.Tests | entitlements, plugin registry, host isolation, manifests, eBay engine |
CI runs on Windows (full solution) and Linux (cross-platform projects); see .github/workflows/ci.yml.
- Live eBay publishing is disabled by default; drafts are validated in sandbox first.
- CardOps runtime data,
.ENV, OAuth tokens, logs, thumbnails, and local SQLite data are never committed. - Build outputs are gitignored and can be redirected with
EA_BUILD_ROOT. - Secrets are redacted in diagnostics bundles.
See SECURITY.md.
| Document | Contents |
|---|---|
| docs/ARCHITECTURE.md | system design, workflows, module responsibilities |
| docs/QUICKSTART.md | install, configure, first publish |
| docs/FEATURE-MATRIX.md | full Free/Pro/addon comparison |
| docs/PLUGIN-DEVELOPMENT.md | build an addon end to end |
| docs/API-REFERENCE.md | eBay endpoints, scopes, config, mapping |
| docs/adr/0001-canonical-architecture.md | canonical architecture decision |
| docs/adr/0003-plugin-runtime.md | plugin runtime decision |
| ROADMAP.md | phased delivery plan |
| MONETIZATION_PLAN.md | pricing model |
| CHANGELOG.md | release history |
See LICENSE.