Quasar + Vue 3 “Twitter-like” timeline clone.
The app lets you create short posts (“Qweets”), renders them in a timeline, and supports real-time updates backed by Firebase Cloud Firestore.
- Create a Qweet (up to 280 chars)
- Real-time timeline updates (Firestore
onSnapshot) - Like/unlike a Qweet (toggle
liked) - Delete a Qweet
- Basic navigation: Home + About + 404 page
- Electron wrapper support (Quasar Electron mode)
- Quasar Framework v2 (UI components + app CLI)
- Vue 3 + Vue Router
- Vite (via
@quasar/app-vite) - Firebase (Firestore)
- date-fns (human-friendly “time ago” formatting)
- Electron (optional desktop builds)
High-level layout of the app:
src/
App.vue # root component (renders router-view)
boot/
firebase.js # Firebase init + Firestore DB export
layouts/
MainLayout.vue # header + left/right drawers + router-view
pages/
PageHome.vue # Qweet composer + timeline, Firestore integration
PageAbout.vue # About page content
ErrorNotFound.vue # 404 page
router/
index.js # router instance
routes.js # route table
src-electron/
electron-main.js # Electron main process window creation
electron-preload.js # (currently template / no APIs exposed)
Routes are defined in src/router/routes.js and mounted with MainLayout.vue:
/→ Home (src/pages/PageHome.vue)/about→ About (src/pages/PageAbout.vue)/:catchAll(.*)*→ 404 (src/pages/ErrorNotFound.vue)
The project uses hash-based routing by default (see quasar.config.js: build.vueRouterMode = 'hash').
src/layouts/MainLayout.vue provides:
- A top header that shows the current route name
- A left drawer with navigation links (Home, About)
- A right drawer with a search input + placeholder “trends/news” list
The timeline is backed by a Firestore collection named qweets.
Each document is expected to look like:
{
content: string, // the qweet text
date: number, // epoch milliseconds (Date.now())
liked: boolean // whether the qweet is liked
}Notes:
- Author name/handle and avatar are currently hard-coded in the UI.
- No pagination/limits are applied yet; the page listens to the whole collection.
src/pages/PageHome.vue subscribes to the qweets collection with:
query(collection(db, 'qweets'), orderBy('date'))onSnapshot(...docChanges())to react to:added→ inserts into the UI listmodified→ updates the matching itemremoved→ removes the item
The UI inserts new items with unshift() so the newest items appear at the top.
- Node.js: this repo is configured to work with Node
^22 || ^20 || ^18 || ^16 || ^14.19 - Yarn Classic (v1) is supported (the repo currently uses Yarn v1)
- Quasar CLI: you can run it via
npx quasaror install globally if you prefer
yarn installIf you see a warning about an unmet peer dependency under firebase, it’s typically safe to ignore for this web-only project.
npx quasar devnpx quasar buildThe Firestore connection is initialized in src/boot/firebase.js.
By default, the repository contains a Firebase project configuration object. If you fork this project, you should:
- Create your own Firebase project
- Enable Cloud Firestore
- Update
src/boot/firebase.jswith your Firebase config - Create a
qweetscollection (or just let the app create it when you post)
This is a minimal example to get started. You should adapt it to your needs:
rules_version = '2';
service cloud.firestore {
match /databases/{database}/documents {
match /qweets/{docId} {
allow read: if true;
allow create, update, delete: if true;
}
}
}This project includes Electron entry points under src-electron/.
To run in Electron dev mode (Quasar CLI):
npx quasar dev -m electronTo build an Electron bundle:
npx quasar build -m electronsrc-electron/electron-preload.js is currently only a template (no APIs are exposed to the renderer).
- Quasar config:
quasar.config.js - Theme variables:
src/css/quasar.variables.sass
Quasar config reference:
- This happens when
package.jsonengines don’t include your Node version. - Ensure you’re on a supported Node version (see Prerequisites), then re-run
yarn install.
- Verify Firestore is enabled in your Firebase project
- Ensure the Firebase config in
src/boot/firebase.jspoints to your project - Check browser console for Firestore permission errors (security rules)

