An Expo / React Native app that lets a shopper preview furniture in their own room using AR, and recommends products using a sentiment-analysis-driven recommendation engine built from customer reviews.
Status: Work in progress. Core recommendation logic is implemented and unit-tested; the AR and UI layers are built but not yet verified on a physical device. See Project Status below. Feedback, issues, and pull requests are very welcome.
AR Furniture combines two features:
- AR Visualization — place a 3D model of a product in your real room using your phone's camera, so you can judge scale, fit, and style before buying.
- Personalized Recommendations — a lexicon-based sentiment analysis engine scores product reviews, then blends that with the user's style preferences, budget, and product popularity to produce a ranked, explainable list of recommendations.
The app currently runs entirely on local sample data (no backend yet), so it can be cloned and explored immediately without any setup beyond npm install.
Recommendation pipeline
reviews.json (free text)
│
▼
analyzeSentiment() — tokenizes text, scores against a polarity lexicon,
handles negation ("not comfortable") and
intensifiers ("very comfortable")
│
▼
aggregateProductSentiment() — blends lexicon sentiment with each review's
star rating into one 0–1 score per product
│
▼
getRecommendations() — combines sentiment + style-tag affinity +
budget fit + popularity into a single
weighted, explainable score
│
▼
Ranked list, with a human-readable reason shown for each recommendation
AR pipeline
User taps "View in your room"
│
▼
resolveArMode() — checks device type and build (physical device with a
dev-client build vs. simulator/Expo Go)
│
├── real device + dev client → ARViewer (ARKit/ARCore via ViroReact,
│ real camera-based plane detection
│ and object placement)
│
└── simulator / Expo Go → MockARViewer (touch-to-rotate 3D
preview via expo-three, no camera
required)
A manual toggle on the AR screen also lets a user switch between modes directly.
There is currently no backend API — the app runs against local JSON fixtures in src/data/:
| File | Contents |
|---|---|
products.json |
8 sample products across 7 categories |
reviews.json |
12 sample free-text reviews with star ratings |
users.json |
2 sample user profiles with budget ranges, style tags, and interaction history |
UserContext signs the app in as the first sample user and records interactions (views, AR try-ons, etc.) in memory as you navigate; this state resets on reload.
The Product, Review, and User types in src/types/index.ts are shaped to match a plausible REST API, so swapping the local JSON imports for real HTTP calls later is a contained change rather than a rewrite.
| Layer | Technology |
|---|---|
| App framework | React Native (Expo SDK 51) |
| Language | TypeScript |
| Navigation | React Navigation (native stack) |
| AR (real) | ViroReact (ARKit / ARCore) |
| AR (fallback/preview) | expo-three, expo-gl |
| Testing | Jest, ts-jest |
AR-DecoVision/
├── App.tsx
├── app.json
├── src/
│ ├── ar/ # ARViewer (real), MockARViewer (preview), mode resolution
│ ├── components/ # ProductCard, StarRating
│ ├── context/ # UserContext (in-memory session state)
│ ├── data/ # products.json, reviews.json, users.json
│ ├── navigation/ # AppNavigator
│ ├── recommendation/ # sentiment analysis + recommendation engine
│ ├── screens/ # Home, ProductDetail, AR, Recommendations
│ └── types/ # shared TypeScript types
└── __tests__/ # Jest unit tests
git clone https://github.com/Humayun-98/AR-DecoVision
cd AR-DecoVision
npm install
npx expo startPress i for the iOS simulator, a for the Android emulator, or scan the QR code with the Expo Go app on your phone.
- Preview mode (no camera, works in Expo Go or a simulator): open any product → "View in your room (AR)". This runs automatically wherever a real camera-based AR session isn't available — drag to rotate the model.
- Real camera AR (requires a physical device): ViroReact's native module isn't available inside Expo Go, so this requires a custom dev client:
Install the resulting build on a physical device, then use "View in your room (AR)" as normal.
npx expo install expo-dev-client eas build --profile development --platform ios # or --platform android
npm test # run the unit test suite
npm run test:coverage # run with a coverage report
npm run typecheck # TypeScript check, no emitThe current suite covers the sentiment analysis engine, the recommendation engine, and the AR mode resolution logic — 24 tests, all passing. UI and native AR components still need to be verified manually on a device or simulator (see below).
Core dependencies are listed in package.json. Notable version constraints worth knowing if you touch AR-related packages:
threeis pinned to0.145.0to satisfyexpo-three's peer dependency.@reactvision/react-virois pinned to2.41.6, the latest release compatible with React Native 0.74 / Expo SDK 51. Newer ViroReact releases require React Native 0.81+.
A plain npm install (no --legacy-peer-deps flag) installs cleanly with these pins.
This project is under active development. Here's where things currently stand:
- ✅ Sentiment analysis engine — implemented, unit-tested
- ✅ Recommendation engine — implemented, unit-tested
- ✅ AR mode resolution logic — implemented, unit-tested
- 🟡 Real AR viewer (ARKit/ARCore via ViroReact) — implemented, not yet verified on a physical device
- 🟡 Mock/preview 3D viewer — implemented, not yet visually verified on a device or simulator
- 🟡 Screens & navigation — implemented, not yet visually verified
- ⬜ Backend API — not started, currently using local sample data
- ⬜ Persistence layer — not started, session state is in-memory only
- The sentiment lexicon is small and hand-built; it won't catch sarcasm or vocabulary outside its word list.
- The mock 3D viewer currently renders a placeholder shape rather than the real product mesh, pending hosted
.glbmodel assets. - There's no persistence yet — interactions recorded during a session are lost on app reload.
This is very much a work in progress, and feedback is genuinely welcome — whether it's a bug, a design critique, or a suggestion for the recommendation scoring. Please open an issue or a pull request.