The source of oxy.so, and of fairco.in, which is the same app answering to a different host.
One React app, two brands.
src/lib/host.ts decides which one you are looking at,
and src/lib/faircoin-chrome.tsx swaps the chrome around it.
Oxy Platforms, Inc. is being incorporated in Delaware as the intended operating company for Oxy services. The website's software licence, copyright and trademark attributions remain separate from this operating-company transition.
|
Every token comes from A brand surface is one seed in |
That means the first paint a visitor sees comes from static HTML, before any JavaScript runs. It is worth remembering when you change anything that renders differently on the server. |
| Layer | What is used |
|---|---|
| App | React 19, Vite 8, TypeScript 6, React Router 7, the React Compiler |
| Styling | Tailwind 4, NativeWind, Bloom design tokens |
| Cross platform UI | React Native Web through vite-plugin-react-native-web, with @oxy.so/services, @oxy.so/core and @oxy.so/bloom |
| Data | TanStack Query with persisted cache, hooks in src/api/ |
| Content | MDX, with docs and changelog synced in at build time, and Pagefind for site search |
| Wallet | wagmi and viem, on the FairCoin surfaces |
| Motion and 3D | Framer Motion, Three.js with React Three Fiber |
| Server | Express 5 with drizzle over PostgreSQL under server/, plus an MCP server at server/mcp.ts |
Identity is the platform's job, not this repo's. See github.com/OxyHQ/oxy.
bun install
bun run devpredev generates the theme CSS and syncs docs and changelog content, then dev starts the Express server and Vite together. The Vite dev server proxies /api to the Express server on port 4000.
bun run build # type check, bundle, index, prerender, pagefind, CSP headers
bun run lint # Biome lint + format check (bun run lint:fix / bun run format to apply)
bun run preview # serve the built output
bun run server # Express onlyLayout
src/
api/ REST client and TanStack Query hooks
components/ UI grouped by surface (homepage, faircoin, mention, pay, docs, ...)
content/ MDX and synced content
contexts/ React contexts
data/ Static fallbacks used when the CMS has nothing
hooks/ Domain hooks
lib/ Pure helpers: host detection, FairCoin links, wagmi config, SEO
pages/ One component per route in App.tsx
stores/ Zustand stores for cross tree UI state
styles/ Product themes plus the generated palette
theme/ Brand seeds
constants.ts Positioning, founder, HQ, feature flags
server/ Express API, models, routes, services, MCP server
scripts/ Build time scripts: theme, docs and changelog sync, prerender, OG images, search index
Other scripts
bun run generate:theme # regenerate src/styles/theme.generated.css from Bloom
bun run sync-docs # pull docs content into src/
bun run sync-changelog # pull changelog content into src/
bun run prerender # prerender routes without a full rebuild
bun run build:help-og # OG images for help articles
bun run build:faircoin-og # OG images for FairCoin pages
bun run optimize-media # compress media in place
bun run analyze # bundle stats
bun run typecheck:server
bun run seed # seed the databaseFeature flags
src/constants.ts exports a FEATURES object that hides sections still waiting on real content. Flip a flag to true once the section it gates has something true to show. The comments in that file say what each one covers.
- Oxy is not a CRM. Oxy CRM is one product in the ecosystem, and the parent brand is an open source ecosystem of AI agents and apps.
- Team, blog, changelog, job and testimonial content comes from the CMS through hooks such as
useTeamMembers,useNewsroomPostsanduseJobs. The static fallbacks undersrc/data/stay empty or generic. - No hardcoded customer logos or testimonials. They stay behind
FEATURES.SHOW_TRUSTED_LOGOSandFEATURES.SHOW_TESTIMONIALSuntil real, verified ones exist. - Never hand write a palette. Change the seed, regenerate, and check the result in a browser with JavaScript blocked as well as with it on. Every page here is prerendered, so a token that only resolves after hydration is a token the visitor saw wrong first.
- The MCP server signs people in with Oxy's MCP OAuth; its bearer token travels in the
Authorizationheader only. Seedocs/MCP.md. - New protected routes on the server use
createOxyAuthMiddlewareandgetRequiredOxyUserIdfrom@oxy.so/core/server. Do not add local auth middleware.