Orderly scrapes SRM Academia to fetch the current day order and seamlessly syncs your class schedule with Google Calendar.
Just log in once, save your timetable and let Orderly handle the rest. Your calendar will update automatically every day.
- Automated Day Order Scraping – Uses Puppeteer to scrape the daily order from Academia.
- Google Calendar Integration – Syncs your classes automatically based on your saved timetable.
- Real-Time Monitoring – Powered by BullMQ for reliable job handling for errors and retries. Uses BullBoard to track job execution and logs.
- Log in using your Google account.
- Add your subjects
- Go to edit timetable and add your classes for each day order
- Save your timetable in the app
- Enable automated events
- Click Manual Trigger to add your schedule into google calendar the first time (Optional)
Orderly will now scrape academia daily at midnight and your classes into your google calendar
- Express
- Prisma
- BullMQ - Job queue for handling background tasks like scraping and calendar event scheduling for mutliple users.
- BullBoard – UI dashboard for monitoring job queues.
- Google APIs – For authentication and Google Calendar integration.
- Puppeteer – Headless browser for web scraping.
- Postgres
- Redis
- Backend: AWS EC2
- Frontend: Vercel
![image](https://private-user-images.githubusercontent.com/82446436/408871859-999d7624-be3e-468a-830d-1367662f0370.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MzkxNjM1MDksIm5iZiI6MTczOTE2MzIwOSwicGF0aCI6Ii84MjQ0NjQzNi80MDg4NzE4NTktOTk5ZDc2MjQtYmUzZS00NjhhLTgzMGQtMTM2NzY2MmYwMzcwLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMTAlMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjEwVDA0NTMyOVomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTdlMmNhZGVkMjY1NDk5ZWY0YjZmZmY3NDFkNzVjMzk3ZWEwMTk2YjUyNWIwNTA1M2ZjZWY0OTg1Y2M2ZmZhNGEmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.LnnmEVL3pWFdWzdISyR7PDmw3vdAGTLtm-An7C2-NY4)
![image](https://private-user-images.githubusercontent.com/82446436/408872040-c0bdb96f-3590-47a7-9ac2-0e15545d0629.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MzkxNjM1MDksIm5iZiI6MTczOTE2MzIwOSwicGF0aCI6Ii84MjQ0NjQzNi80MDg4NzIwNDAtYzBiZGI5NmYtMzU5MC00N2E3LTlhYzItMGUxNTU0NWQwNjI5LnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMTAlMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjEwVDA0NTMyOVomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTY2M2IzMjQ0MzUyY2YyOTBhMTIyOGViMDA1YTMxMTEwZDU1YjBiNDJjNjYxNDhkODY4MzNhODAxZGRmMWExZTcmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.LuyaILDoE1O9GXzYeAOZH064INwzLw-T1tbZWJoqCCE)
![image](https://private-user-images.githubusercontent.com/82446436/408872101-337b2116-7e5d-4267-acd2-0d419c528d6a.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MzkxNjM1MDksIm5iZiI6MTczOTE2MzIwOSwicGF0aCI6Ii84MjQ0NjQzNi80MDg4NzIxMDEtMzM3YjIxMTYtN2U1ZC00MjY3LWFjZDItMGQ0MTljNTI4ZDZhLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMTAlMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjEwVDA0NTMyOVomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPWVjOTI4ODI1ZDYxMWJkNzliM2RiZDUzZDZhZmRhYzRjYWZjNTEzNTYzYmIxMWEyOGNjYzUyNGFlYTRhNTk2YmUmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.T3eXO2B7tsqxaddTp2LALMVy_wYucDrCnr7tu4eyTPg)
![image](https://private-user-images.githubusercontent.com/82446436/408872250-571fd94f-76f2-406c-a5a7-6a09380c9f76.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MzkxNjM1MDksIm5iZiI6MTczOTE2MzIwOSwicGF0aCI6Ii84MjQ0NjQzNi80MDg4NzIyNTAtNTcxZmQ5NGYtNzZmMi00MDZjLWE1YTctNmEwOTM4MGM5Zjc2LnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMTAlMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjEwVDA0NTMyOVomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTExYTFmYmMxZGE1MjI1MDQ0Y2JlMTcxMzIwMGFmOWU3YmMwYjVmY2QxODgxNGZiMGVlOGU0YmVkOTVhYmMwMWUmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.jz6LljofP5h13ulGVUQv34agj9opfQk2UHsEZiO4a0g)
![image](https://private-user-images.githubusercontent.com/82446436/408872328-cffcd1cc-1920-41d0-aa11-49569f0c26bf.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MzkxNjM1MDksIm5iZiI6MTczOTE2MzIwOSwicGF0aCI6Ii84MjQ0NjQzNi80MDg4NzIzMjgtY2ZmY2QxY2MtMTkyMC00MWQwLWFhMTEtNDk1NjlmMGMyNmJmLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMTAlMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjEwVDA0NTMyOVomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPWViODZjYmI4YWRhMDNkNTVlOWFjNmU4MjZkMWE4ZWZkYzE5NWUyMmZkMmMxY2ZjNzUyMDBmYWU5NWViMTQ3MjkmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.NDc3PBQZJSntnuvf68p1sY0WPLOU2Fp642l4rL2j-x4)
![image](https://private-user-images.githubusercontent.com/82446436/408872348-95388160-477d-4b85-bc98-7b8215135a68.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MzkxNjM1MDksIm5iZiI6MTczOTE2MzIwOSwicGF0aCI6Ii84MjQ0NjQzNi80MDg4NzIzNDgtOTUzODgxNjAtNDc3ZC00Yjg1LWJjOTgtN2I4MjE1MTM1YTY4LnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMTAlMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjEwVDA0NTMyOVomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTYzNWYxYTUyZTlhNGQwOGVmYjkwMTE5YWU5MmZmMzdlZTEyNjM3YzQ1MTZhNzQwNDQ0NjUxMzY4NGEwZjM2MjMmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.UfEgEgCx5YgVVV61Ydjg31vL85YwtSciblH4DMxz2m4)
![image](https://private-user-images.githubusercontent.com/82446436/408872566-c88ff7ca-c3aa-42e9-9612-248c0d9e3f4b.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MzkxNjM1MDksIm5iZiI6MTczOTE2MzIwOSwicGF0aCI6Ii84MjQ0NjQzNi80MDg4NzI1NjYtYzg4ZmY3Y2EtYzNhYS00MmU5LTk2MTItMjQ4YzBkOWUzZjRiLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMTAlMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjEwVDA0NTMyOVomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTU1N2I3YjRhYWIyMWVhNDM4NWQ5Y2M2MjUzNjk3YmRhOWUzNDA1YzRhMGMzNDkyMjJjMmU0MmQwZjdhOGYwMzEmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.zNX2y4F4uLKc0b9j0_OIVPVvlibypqEjZ0yCqeeG3nM)
- Clone the repository:
git clone https://github.com/swebi/Orderly.git cd server
- Install dependencies:
pnpm install
- Set up environment variables in a .env file:
EMAIL = <SRM Academia email> PASSWORD = <SRM Academia password> DATABASE_URL= <Postgres URL> CLIENT_ID= <Google Client ID> CLIENT_SECRET= <Google Client Secret> SERVER_URL= <Backend URL> REDIRECT_URL= <Backend endpoint for google auth redirect> ADMIN_PASSWORD= <String> CLIENT_URL= <Frontend URL>
- Run database migrations:
pnpm dlx prisma db push
- Start the server:
pnpm dev
- Navigate to the frontend folder:
cd client
- Install dependencies:
pnpm install
- Set up environment variables in a .env file:
VITE_PUBLIC_SERVER_URL = <Backend URL> VITE_PUBLIC_GITHUB_URL = <GitHub URL>
- Start the server:
pnpm dev