Skictynote is a responsive React notes application with Gemini-powered actions for summarizing and improving note content.
- Create, edit, and delete notes
- Persist notes in browser
localStorage - Expand a note into a full-screen editor on focus
- Responsive layout for mobile, tablet, and desktop
- Summarize notes with Gemini
- Improve note writing with Gemini
- Backend rate limiting for AI requests
- CORS-protected frontend/backend communication
- React 19
- Vite
- Tailwind CSS
- Tabler Icons
- Node.js
- Express
- Google Gemini API
express-rate-limitcors
notes/
├── README.md
├── .gitignore
├── frontend/
│ ├── .env.example
│ ├── .gitignore
│ ├── eslint.config.js
│ ├── index.html
│ ├── package.json
│ ├── package-lock.json
│ ├── vite.config.js
│ ├── public/
│ │ └── icon.png
│ └── src/
│ ├── App.css
│ ├── App.jsx
│ ├── main.jsx
│ ├── components/
│ │ ├── Nav.jsx
│ │ └── NoteBox.jsx
│ └── utils/
│ └── date.js
└── backend/
├── .env.example
├── .gitignore
├── index.js
├── package.json
├── package-lock.json
└── src/
├── index.js
├── config/
│ └── env.js
├── controllers/
│ └── app.controllers.js
├── middleware/
│ ├── error.handling.js
│ ├── rateLimiter.js
│ └── validateAi.js
├── prompt/
│ └── prompt.js
├── routes/
│ └── app.routes.js
├── services/
│ └── gemini.services.js
└── utils/
└── appError.js
git clone https://github.com/kaushalsahu07/notes.git
cd notesCreate backend/.env from backend/.env.example:
PORT=3000
GEMINI_API_KEY=your_gemini_api_key
GEMINI_MODEL=your_gemini_model
CLIENT_ORIGIN=http://localhost:5173Install backend dependencies and start the API:
cd backend
npm install
npm run devThe backend runs at http://localhost:3000.
The health endpoint is:
GET http://localhost:3000/
Open a second terminal from the repository root and create
frontend/.env from frontend/.env.example:
VITE_CLIENT_ORIGIN=http://localhost:3000Install frontend dependencies and start Vite:
cd frontend
npm install
npm run devOpen http://localhost:5173 in your browser.
Restart the Vite server whenever a frontend .env value changes.
Create a Vercel project with the repository backend/ directory as its
Root Directory. The included backend/vercel.json configures the Express
API as a Vercel function. Set these environment variables in Vercel:
GEMINI_API_KEY=your_gemini_api_key
GEMINI_MODEL=your_gemini_model
CLIENT_ORIGIN=https://your-netlify-site.netlify.appCreate a Netlify project with the repository frontend/ directory as its
Base directory. The included frontend/netlify.toml builds and publishes
the Vite output and enables SPA routing. Set this environment variable in
Netlify to the deployed Vercel API origin:
VITE_CLIENT_ORIGIN=https://your-vercel-api.vercel.appPOST http://localhost:3000/app
Request body:
{
"option": "summarize",
"content": "Your note content goes here."
}Supported options:
summarizeimprove
Successful response:
{
"success": true,
"data": {
"text": "Generated Gemini response"
}
}The endpoint allows up to 10 requests per IP address per minute. Invalid
content returns a 400 response, and rate-limited clients receive a 429
response.
Run these commands from the relevant application directory:
# Frontend
npm run dev
npm run build
npm run lint
# Backend
npm run dev
npm startNotes are currently stored in the browser's localStorage under the key
notes. The backend does not store note records; it only processes AI
requests.
- GitHub: @kaushalsahu07
- Portfolio: kaushalsahu.tech
- LinkedIn: @kaushalsahu07
- Instagram: @cd.kaushal
Created with ❤️ by Kaushal Sahu.