Aurews is a cross-platform news reading and publishing application built as a four-member university team project for IE307 – Cross-Platform Mobile Application Development at the University of Information Technology, VNU-HCM.
The application combines a React Native mobile experience with a Node.js backend and AI-assisted features for reading, listening to, exploring, and creating news content.
Project status: Academic prototype. Aurews demonstrates the main product flows and integrations, but it is not presented as a production-scale news platform.
Aurews was designed around three main experiences:
- Readers can discover articles, personalize their feed, read in a focused mode, interact with authors, save content, and ask questions about an article.
- Authors can create and manage articles using a rich-text editor, voice input, AI-assisted rewriting, image upload, and draft management.
- Administrators have basic workflows for user management, author applications, reports, and content oversight.
The frontend and backend are separated through a client-server architecture and communicate using RESTful APIs.
- onboarding and topic preference selection;
- user registration, login, password recovery, and profile management;
- personalized home feed and category-based exploration;
- article search and user search;
- article detail pages with HTML content rendering;
- comments, likes, bookmarks, follows, and reading history;
- notifications related to user interactions;
- immersive reader mode with configurable reading preferences;
- audio article playback with play, pause, progress, and mini-player controls;
- AI-assisted article Q&A based on the selected article;
- related-article suggestions.
- author application workflow;
- author dashboard and article management;
- create, edit, publish, schedule, delete, and restore articles;
- rich-text article editor;
- image upload through Cloudinary;
- speech-to-text input for article drafting;
- Gemini-assisted text refinement;
- draft and autosave-oriented editing workflow;
- article status and publishing controls.
- basic administrator dashboard;
- user management;
- author application review;
- report handling;
- content and account oversight.
The admin functionality is intentionally described as basic because advanced moderation, analytics, and granular authorization were outside the full scope of the academic project.
Aurews integrates Google services to improve both reading and writing workflows.
The application sends article context to Gemini so that readers can ask questions about the article they are currently viewing.
This feature is intended to help users:
- clarify important points;
- explore the article more deeply;
- generate context-related questions;
- discover related content.
Google Cloud Text-to-Speech is used to generate audio from article content.
The mobile client supports:
- audio playback;
- pause and resume;
- playback progress;
- background-oriented listening;
- compact mini-player controls.
Google Cloud Speech-to-Text supports voice input in the article editor, allowing an author to convert recorded speech into editable text.
Gemini is also used as an editorial assistant to:
- correct spelling and grammar;
- improve clarity;
- produce a more formal journalistic tone;
- preserve the original facts, names, and numerical information.
AI output should still be reviewed by the author before publication.
flowchart LR
User[Reader / Author / Admin] --> Mobile[React Native + Expo]
Mobile --> API[Node.js + Express REST API]
API --> Mongo[(MongoDB)]
API --> Redis[(Redis)]
API --> Cloudinary[Cloudinary]
API --> Gemini[Gemini API]
API --> STT[Google Speech-to-Text]
API --> TTS[Google Text-to-Speech]
API --> SMTP[SMTP Email Service]
The React Native client is responsible for:
- navigation and screen rendering;
- user interaction;
- server-state fetching and synchronization;
- local and global client state;
- reader, author, and administrator interfaces;
- loading, empty, and error states;
- audio playback and editor interactions.
The Express backend is responsible for:
- authentication and authorization;
- user, article, comment, report, and application APIs;
- MongoDB persistence;
- refresh-token storage with Redis;
- Cloudinary uploads;
- AI and speech-service integrations;
- input handling and centralized error responses;
- email-based flows such as password recovery.
- React Native
- Expo
- TypeScript
- Expo Router
- TanStack Query
- Zustand
- React Hook Form
- Zod
- FlashList
- React Native Render HTML
- React Native Pell Rich Editor
- Expo AV
- Expo Speech
- Expo Image
- AsyncStorage
- SecureStore
- Node.js
- Express 5
- JavaScript ES Modules
- MongoDB
- Mongoose
- Redis / ioredis
- JSON Web Token
- bcryptjs
- Cloudinary
- Multer
- Nodemailer
- Morgan
- CORS
- Compression
- Google Gemini
- Google Cloud Speech-to-Text
- Google Cloud Text-to-Speech
- Cloudinary
- Jest
- Supertest
- MongoDB Memory Server
- Postman
Aurews separates different categories of frontend state.
TanStack Query is used for server state such as:
- article lists;
- article details;
- comments;
- user data;
- mutations and cache invalidation;
- loading and error handling.
Zustand is used for shared client state such as:
- authentication-related client data;
- preferences;
- interface settings;
- audio-player state;
- cross-screen application state.
This separation helps avoid treating remote server data and local UI state as the same concern.
The backend uses access and refresh tokens.
- Access tokens are short-lived.
- Refresh tokens are stored and validated through Redis.
- Passwords are hashed with bcryptjs.
- Protected routes verify the current user.
- Role-based flows distinguish normal users, authors, and administrators.
- The frontend API client attempts token refresh when a protected request receives
401 Unauthorized.
This authentication implementation was created for the academic project and should receive additional security review before production use.
The API is mounted under /api.
/api/auth Authentication and token workflows
/api/users Profiles, preferences, follows, bookmarks, and user data
/api/posts Article CRUD, search, publishing, AI, speech, and reading flows
/api/comments Article comments
/api/applications Author application workflows
/api/reports User and content reports
A health-check endpoint is also available:
GET /ping
Aurews/
├── backend/
│ ├── src/
│ │ ├── controllers/ # Request handlers and application workflows
│ │ ├── lib/ # Database, Redis, token, cookie, and cloud config
│ │ ├── middlewares/ # Authentication, validation, and request handling
│ │ ├── models/ # Mongoose schemas
│ │ ├── routes/ # REST API routes
│ │ ├── services/ # Reusable business logic
│ │ ├── utils/ # Email, uploads, errors, and helpers
│ │ ├── app.js # Express application configuration
│ │ └── server.js # Server startup
│ ├── tests/
│ └── package.json
│
└── frontend/
├── app/ # Expo Router screens and layouts
│ ├── (auth)/
│ ├── (tabs)/
│ ├── admin/
│ ├── author/
│ ├── onboarding/
│ └── user/
├── src/
│ ├── api/ # API client
│ ├── components/ # Shared UI components
│ ├── hooks/ # Data and feature hooks
│ ├── stores/ # Zustand stores
│ ├── types/
│ └── utils/
└── package.json
- Node.js
- npm
- MongoDB
- Redis or an Upstash Redis instance
- an Expo-compatible development environment
- Google Cloud credentials for Speech-to-Text and Text-to-Speech
- a Gemini API key
- Cloudinary credentials
- SMTP credentials for email features
cd backend
npm installCreate backend/.env:
NODE_ENV=development
PORT=6666
MONGO_URI=mongodb://127.0.0.1:27017/aurews
JWT_ACCESS_SECRET=replace_with_a_secure_access_secret
JWT_REFRESH_SECRET=replace_with_a_secure_refresh_secret
UPSTASH_REDIS_URL=redis://127.0.0.1:6379
CLOUDINARY_CLOUD_NAME=your_cloud_name
CLOUDINARY_API_KEY=your_api_key
CLOUDINARY_API_SECRET=your_api_secret
GEMINI_API_KEY=your_gemini_api_key
CLIENT_URL=http://localhost:8081
SMTP_HOST=your_smtp_host
SMTP_PORT=587
SMTP_USER=your_smtp_username
SMTP_PASS=your_smtp_password
APP_NAME=AurewsFor Google Cloud Speech-to-Text and Text-to-Speech, configure Application Default Credentials or set:
GOOGLE_APPLICATION_CREDENTIALS=/absolute/path/to/service-account.jsonNever commit real API keys, service-account files, database credentials, or SMTP passwords.
Start the backend:
npm run devThe server uses port 6666 by default unless another PORT is supplied.
Test the server:
http://localhost:6666/ping
cd frontend
npm installCreate frontend/.env:
EXPO_PUBLIC_BASE_API_URL=http://YOUR_BACKEND_HOST:6666/apiExamples:
For an emulator or web environment where localhost reaches the backend:
EXPO_PUBLIC_BASE_API_URL=http://localhost:6666/apiFor Expo Go on a physical phone, use the computer's LAN IP:
EXPO_PUBLIC_BASE_API_URL=http://192.168.1.10:6666/apiStart Expo:
npm startOther available commands:
npm run android
npm run ios
npm run web
npm run lint
npm testThe phone and development computer normally need to be reachable on the same network when using a LAN backend address.
Run the backend tests with:
cd backend
npm testThe backend includes Jest and Supertest support, with MongoDB Memory Server available for isolated test data.
Postman was also used during the project to validate the main API workflows.
Aurews was developed collaboratively by Group 14.
The summary below follows the responsibility allocation documented in the submitted project report. It describes each member's main areas of work and does not imply that every file or feature was developed in complete isolation.
- reorganized the backend around routes, controllers, services, and models;
- separated database, port, and secret configuration;
- created shared success and error response helpers;
- worked on user schemas and user/admin roles;
- improved image upload handling;
- implemented token-verification middleware;
- worked on article search and sorting;
- added input validation and rate limiting;
- tested backend APIs with Postman.
- initialized the mobile application and frontend structure;
- implemented the core reader flow from home to article details, comments, and bookmarks;
- built article lists, category navigation, reading interfaces, comments, and saved-article screens;
- replaced mock data with backend API integration;
- tested the main user flows;
- worked on home-feed personalization;
- implemented article AI chat, text-to-speech, speech-to-text, and AI-assisted writing workflows;
- improved article-management interactions and related frontend/backend integration.
- designed category and article schemas;
- implemented category CRUD operations;
- separated article routes, controllers, and services;
- worked on paginated article retrieval;
- contributed to registration and login APIs;
- implemented article comments and bookmark operations;
- resolved integration conflicts and supported branch merging.
- initialized the administrator interface;
- designed the admin login, create, edit, and publish flows;
- implemented article forms for title, content, and thumbnail;
- added loading, empty, and error states;
- connected administrator content-management screens to backend APIs;
- tested the main administrator flows.
Aurews demonstrates a broad set of modern mobile and backend concepts, but several areas remain intentionally limited:
- recommendation logic is not a production-grade machine-learning recommender;
- load and scalability testing were not performed at production traffic levels;
- administrator analytics and advanced moderation remain limited;
- real-time notifications were outside the complete implementation scope;
- AI and speech features depend on third-party availability, quotas, and pricing;
- production deployment, observability, distributed caching, and high-availability infrastructure require further work.
These limitations are documented to distinguish implemented academic work from future production improvements.
- add a stronger behavior-based recommendation system;
- introduce real-time notifications;
- add broader automated test coverage;
- containerize frontend support services and the backend;
- add CI workflows;
- improve role and permission granularity;
- add cache and MongoDB query optimization;
- add production monitoring and structured logging;
- improve AI failure handling and fallback behavior;
- add accessibility testing;
- benchmark large article feeds and concurrent users;
- add a documented seed-data workflow.
- Course: IE307 – Cross-Platform Mobile Application Development
- Project: Aurews News Application
- Institution: University of Information Technology, VNU-HCM
- Team: Group 14
- Academic period: 2025–2026
- Nguyễn Xuân Đình Lực
- Nguyễn Phước Sang
- Bùi Vũ Bảo Chấn
- Nguyễn Hữu Việt Cường