A macOS Native Google Classroom Client
- Basic google classroom parity
- Loading courses
- Loading posts
- Viewing submissions
- Viewing class members
- Advanced google classroom parity
- Post creation
- View student submissions
- Submit in-app (Not possible rn due to API restrictions)
- Grading
- User Speed Improvements/Conveniences
- Practically instant loading (via post caching)
- Offline mode (same reason)
- Quick open/search (so you can open courses without having to hunt for them with your mouse. Just search by name.)
- Sorting by post type (eg. only announcements, assignements, or materials)
- Viewing multiple courses' posts at once (bit buggy rn tho :P)
- Post tagging
- Customisability
- Client-side grouping courses into folders
- Client-side archiving of courses
- Custom course colors/icons
- Renaming your classes
- Date groups for posts (eg. "Last month", "This year" in that image)
- Accessibility
- Bionic reading (bolds the first few characters of a word, helps adhd people focus when reading)
Category | Google Classroom Web | GlassRoom (cached) | GlassRoom (non-cached) |
---|---|---|---|
Launching website/app | 4.68s | N/A | 0.99s |
Loading courses | 3.50s | 0.00s | 1.48s |
Loading posts | 2.80s | 0.14s | 1.18s |
Loading post's submission | 0.90s | 0.13s | 0.31s |
Announcements and posts
![image](https://private-user-images.githubusercontent.com/93832702/245019409-389e9b26-59bb-4498-89d8-b9454c8bf6f7.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3Mzg5MTI0NzksIm5iZiI6MTczODkxMjE3OSwicGF0aCI6Ii85MzgzMjcwMi8yNDUwMTk0MDktMzg5ZTliMjYtNTliYi00NDk4LTg5ZDgtYjk0NTRjOGJmNmY3LnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMDclMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjA3VDA3MDkzOVomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTcxMjNiZjU3MjcxZGY3ZWViNzQ4MzA1NGRlMGNhMzA0NmJmY2UzMDQ4ZjVmYjFkODg5YTA2MTY4MjM0MGNiNjkmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.VNxao-tT7j70-um3vhnyZgjo8mZsXtGvpGVSs_yfTyo)
![image](https://private-user-images.githubusercontent.com/93832702/245019893-475d411b-9073-4d95-bb9a-06eea3654539.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3Mzg5MTI0NzksIm5iZiI6MTczODkxMjE3OSwicGF0aCI6Ii85MzgzMjcwMi8yNDUwMTk4OTMtNDc1ZDQxMWItOTA3My00ZDk1LWJiOWEtMDZlZWEzNjU0NTM5LnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMDclMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjA3VDA3MDkzOVomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPWQxYWZmNmRhM2I5MDdmOTZkYjE2NTJmNGYyNmIxMGZjZDg3NWU1MDFjNTQxNzkyNmIzNzIwOTJkY2Y0ZGNjOTMmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.YMPuAyRGDjSDkSP-w4AmJX9BDxvM0ehoZ3Nsa_xlXig)
Aggregate view
![image](https://private-user-images.githubusercontent.com/93832702/245023485-93ff9d7d-2588-49df-a5b3-43d2cd2486a9.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3Mzg5MTI0NzksIm5iZiI6MTczODkxMjE3OSwicGF0aCI6Ii85MzgzMjcwMi8yNDUwMjM0ODUtOTNmZjlkN2QtMjU4OC00OWRmLWE1YjMtNDNkMmNkMjQ4NmE5LnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMDclMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjA3VDA3MDkzOVomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPWM4YWQ3ZTY0Y2RlM2IwZWY0YTZhNmVmMjQ5YWY5MzEzMjQ1YWQ3ZGYyYTg3YWVmY2QwNDk4ODFiZmRkMTAzMmImWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.B6NMXAPVH9Vqu7licFMKToZdqX6uo6ExMmtTrZ4-OHA)
Search
![image](https://private-user-images.githubusercontent.com/93832702/245020257-ea38c545-1384-45c8-96ac-5f2f397cb064.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3Mzg5MTI0NzksIm5iZiI6MTczODkxMjE3OSwicGF0aCI6Ii85MzgzMjcwMi8yNDUwMjAyNTctZWEzOGM1NDUtMTM4NC00NWM4LTk2YWMtNWYyZjM5N2NiMDY0LnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMDclMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjA3VDA3MDkzOVomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTk5NjFlODhiMjEyZDcyM2UyODdjZmM2MjJiYmM1MzgxYmFkZDVjMzM2Zjg0MjRmMmQ0NTQ0NmQ0Y2U1OTYyNjMmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.MiZbMIWIRKtczjETiUtLB5b1wtcCCPvvUaAfsitzcn0)
![image](https://private-user-images.githubusercontent.com/93832702/245020361-bbbf1bfd-7706-48b9-8d40-82eec9c37a66.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3Mzg5MTI0NzksIm5iZiI6MTczODkxMjE3OSwicGF0aCI6Ii85MzgzMjcwMi8yNDUwMjAzNjEtYmJiZjFiZmQtNzcwNi00OGI5LThkNDAtODJlZWM5YzM3YTY2LnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMDclMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjA3VDA3MDkzOVomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPWRkY2QwMTAwMDIwOWE2NTZkNzIzNGYzOTJjNjJhNGUzZjk0Mjc2ZWNmNjQwYWUwNDIwNDM2ZDE0NzBhYTgxMGUmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.qsD_F86eHYKnreZBb5BQ4FBA3LNpCOKkeq11B_niU-A)
Settings and Customisation
![image](https://private-user-images.githubusercontent.com/93832702/245021997-1447e1c5-00cc-438e-a7d7-917309d2f3d2.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3Mzg5MTI0NzksIm5iZiI6MTczODkxMjE3OSwicGF0aCI6Ii85MzgzMjcwMi8yNDUwMjE5OTctMTQ0N2UxYzUtMDBjYy00MzhlLWE3ZDctOTE3MzA5ZDJmM2QyLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMDclMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjA3VDA3MDkzOVomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTc4MWNkY2NhMGJhYzBkMWFjYTg2YTVlZTc2MWY4ODY3YmQ3OGM0MjM5ODFiMjc4YjQ0ZGI2M2NkNzgxZWQxMzImWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.YWD_xT3cxcdSj0X-KhEtpDIOc-gJ5wm7D6QOKGKfsVc)
![image](https://private-user-images.githubusercontent.com/93832702/245022075-402f5819-2bd4-40a3-9144-1dc957c9b1ed.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3Mzg5MTI0NzksIm5iZiI6MTczODkxMjE3OSwicGF0aCI6Ii85MzgzMjcwMi8yNDUwMjIwNzUtNDAyZjU4MTktMmJkNC00MGEzLTkxNDQtMWRjOTU3YzliMWVkLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMDclMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjA3VDA3MDkzOVomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTcxZTI3Mzk0NTdlYTQ1YTBjMWQ2ZjhhNzAzNWIxOTkyZDIzMWExYWVjYjk4MzdkMDQ3NGIxMTM5OGNkMGFjN2EmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.N8O6W5kCyL7EQqNrU9LoAKh4gQIRWDA2Q1fNWFe2whs)
Fancy UI option
![image](https://private-user-images.githubusercontent.com/93832702/245021253-0f946152-27ca-4e7a-a446-267a6d7738b5.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3Mzg5MTI0NzksIm5iZiI6MTczODkxMjE3OSwicGF0aCI6Ii85MzgzMjcwMi8yNDUwMjEyNTMtMGY5NDYxNTItMjdjYS00ZTdhLWE0NDYtMjY3YTZkNzczOGI1LnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMDclMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjA3VDA3MDkzOVomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPWMzNjExM2RlNWJhYzQ2YWU2NmYyYjkyYmE1ODM3NDJhY2M0Njc3ODA1ZjBkZDE4YzgxZGE5M2I3NDIxM2M2OTgmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.cnDsPy579CriF-YXQe6COzEiJafbqX_MyVcQajcAjDo)
Accessibility - Bionic reading
![image](https://private-user-images.githubusercontent.com/93832702/245021482-f7e6f272-6c7b-4d57-ab04-919e3e620397.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3Mzg5MTI0NzksIm5iZiI6MTczODkxMjE3OSwicGF0aCI6Ii85MzgzMjcwMi8yNDUwMjE0ODItZjdlNmYyNzItNmM3Yi00ZDU3LWFiMDQtOTE5ZTNlNjIwMzk3LnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMDclMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjA3VDA3MDkzOVomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPWVhOTcyNzVkNTIzM2Q3MDE5MjgyZmFjYTliZjE2MDQzNzk3NTgxMTk3MTJlYTQ4YzY4NTZiYTMwZGIxOGFiMDcmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.xTGZ6-_qkuLNOnKylvcl3Nxu-1oqQSl-ddWhT9KkmO0)
Prerequisite: You have a google developer project with an API key capable of utilising Google Classroom and Drive APIs
- Add your own
The-GlassRoom-Info.plist
file at the top level of the repo, in this format:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleURLTypes</key>
<array>
<dict>
<key>CFBundleTypeRole</key>
<string>Editor</string>
<key>CFBundleURLSchemes</key>
<array>
<string>com.googleusercontent.apps.[YOUR_KEY_HERE]</string>
</array>
</dict>
</array>
</dict>
</plist>
- Create
Secrets (Sensitive).swift
, extend theSecrets
enum and overridestatic func getGoogleClientID() -> String
to return your API key - Change the bundle identifier and team in the xcodeproj to your own