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.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MTg4MjYwNzAsIm5iZiI6MTcxODgyNTc3MCwicGF0aCI6Ii85MzgzMjcwMi8yNDUwMTk0MDktMzg5ZTliMjYtNTliYi00NDk4LTg5ZDgtYjk0NTRjOGJmNmY3LnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNDA2MTklMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjQwNjE5VDE5MzYxMFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPWFmYjQ2ODY3MGJhOTllNjY1NjFmYzJiNDE3NGJlYjRmZTQxNzJkODMzMDBiZGI2MWI3ZjhkMWE0NDQ5YzY0YWUmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0JmFjdG9yX2lkPTAma2V5X2lkPTAmcmVwb19pZD0wIn0.cf2HJAhQJUFq-XpoQs-W3CBNt8wsduxDg9mDTJU9Sus)
![image](https://private-user-images.githubusercontent.com/93832702/245019893-475d411b-9073-4d95-bb9a-06eea3654539.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MTg4MjYwNzAsIm5iZiI6MTcxODgyNTc3MCwicGF0aCI6Ii85MzgzMjcwMi8yNDUwMTk4OTMtNDc1ZDQxMWItOTA3My00ZDk1LWJiOWEtMDZlZWEzNjU0NTM5LnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNDA2MTklMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjQwNjE5VDE5MzYxMFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPWY2MGVmMDMyM2RlNWI3NmE4OGJlMWFiNzNlYjMwNjg0N2RlNjc5MWQ3YjUzZjEzYjAxNmQwYzMyM2ZiODU5ZTMmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0JmFjdG9yX2lkPTAma2V5X2lkPTAmcmVwb19pZD0wIn0.WnuLjiSAVZvLsAbIYXrdn-3UOn0dnz_MMCiEMtmXtDs)
Aggregate view
![image](https://private-user-images.githubusercontent.com/93832702/245023485-93ff9d7d-2588-49df-a5b3-43d2cd2486a9.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MTg4MjYwNzAsIm5iZiI6MTcxODgyNTc3MCwicGF0aCI6Ii85MzgzMjcwMi8yNDUwMjM0ODUtOTNmZjlkN2QtMjU4OC00OWRmLWE1YjMtNDNkMmNkMjQ4NmE5LnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNDA2MTklMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjQwNjE5VDE5MzYxMFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPThkNGE0MWMwYTEzNDdkZTlkMzc4NzZhOTRhMjlhNDI1MjEwYzM1MTFiMTVlOTNhYzZhYzY1ZDRmNjllNDhmZGUmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0JmFjdG9yX2lkPTAma2V5X2lkPTAmcmVwb19pZD0wIn0.feSKkHjGDt6GqrPE7ECW9WC92sOhsBymD3DWVW4PNUc)
Search
![image](https://private-user-images.githubusercontent.com/93832702/245020257-ea38c545-1384-45c8-96ac-5f2f397cb064.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MTg4MjYwNzAsIm5iZiI6MTcxODgyNTc3MCwicGF0aCI6Ii85MzgzMjcwMi8yNDUwMjAyNTctZWEzOGM1NDUtMTM4NC00NWM4LTk2YWMtNWYyZjM5N2NiMDY0LnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNDA2MTklMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjQwNjE5VDE5MzYxMFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTExMzEyZDNkZDRlN2NkN2UyYTg3ZGY0MjZhNjQwODliMGQ2MzMxMzhiZWU4NzUzNjk4ZDBkYTVkN2M5MzIzZGYmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0JmFjdG9yX2lkPTAma2V5X2lkPTAmcmVwb19pZD0wIn0.aA7r-vU4lA-JVuhcJ6Y0_2Mb2ImvVVQK5uzkPaGxKL8)
![image](https://private-user-images.githubusercontent.com/93832702/245020361-bbbf1bfd-7706-48b9-8d40-82eec9c37a66.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MTg4MjYwNzAsIm5iZiI6MTcxODgyNTc3MCwicGF0aCI6Ii85MzgzMjcwMi8yNDUwMjAzNjEtYmJiZjFiZmQtNzcwNi00OGI5LThkNDAtODJlZWM5YzM3YTY2LnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNDA2MTklMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjQwNjE5VDE5MzYxMFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTM1NjhkYzg4ZTRmMjk5ZTk0YTljYWU2NjZmODNjYjgzY2ZkMzFhOGU0ZThhMGE1YTFkZGRhYjNhOTJkMTJjNzkmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0JmFjdG9yX2lkPTAma2V5X2lkPTAmcmVwb19pZD0wIn0.d_syfCK-oD9Gyp1YXNXJn4byxVWLDZWrLsMpoKN8UvQ)
Settings and Customisation
![image](https://private-user-images.githubusercontent.com/93832702/245021997-1447e1c5-00cc-438e-a7d7-917309d2f3d2.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MTg4MjYwNzAsIm5iZiI6MTcxODgyNTc3MCwicGF0aCI6Ii85MzgzMjcwMi8yNDUwMjE5OTctMTQ0N2UxYzUtMDBjYy00MzhlLWE3ZDctOTE3MzA5ZDJmM2QyLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNDA2MTklMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjQwNjE5VDE5MzYxMFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPWRmZmEzZGM1MjBlNWZkMmM3YmE5ZmEzZGNmNDlmOTM5ZGIxNWE2MTY4ZGI4MWU4N2UyMjRiNTM5NWI0ZmY0MzEmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0JmFjdG9yX2lkPTAma2V5X2lkPTAmcmVwb19pZD0wIn0.YIUYqMyV1D6g9TYC0_vb8HEysXa34SZFP2bkfVTeP9Y)
![image](https://private-user-images.githubusercontent.com/93832702/245022075-402f5819-2bd4-40a3-9144-1dc957c9b1ed.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MTg4MjYwNzAsIm5iZiI6MTcxODgyNTc3MCwicGF0aCI6Ii85MzgzMjcwMi8yNDUwMjIwNzUtNDAyZjU4MTktMmJkNC00MGEzLTkxNDQtMWRjOTU3YzliMWVkLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNDA2MTklMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjQwNjE5VDE5MzYxMFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPWExMDJiMGM5OTE3Y2U4ZGNlZjY1ZGRlYTQ4MDQ4OWI3NmFlODE5YjZlOTQyMTlmZmIyZjRiODEzMDk1ODA1YWMmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0JmFjdG9yX2lkPTAma2V5X2lkPTAmcmVwb19pZD0wIn0.Bg1UBOryaiqm59QMlnVLhOCoh7spR_i6tYwP_n8B56Q)
Fancy UI option
![image](https://private-user-images.githubusercontent.com/93832702/245021253-0f946152-27ca-4e7a-a446-267a6d7738b5.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MTg4MjYwNzAsIm5iZiI6MTcxODgyNTc3MCwicGF0aCI6Ii85MzgzMjcwMi8yNDUwMjEyNTMtMGY5NDYxNTItMjdjYS00ZTdhLWE0NDYtMjY3YTZkNzczOGI1LnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNDA2MTklMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjQwNjE5VDE5MzYxMFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPWM2MTU0NDVjZWYwMGMxNTY1NTg1YmQ5MmM5MWFkMmRmZTJjNTQxMzcxNGRhZmQzMmRmNDFmMzMyMGZmMzM3OTEmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0JmFjdG9yX2lkPTAma2V5X2lkPTAmcmVwb19pZD0wIn0.blPxS58NYyNpkjWyXBJVglvCQtf9O5cf5GSgf4Ogw_k)
Accessibility - Bionic reading
![image](https://private-user-images.githubusercontent.com/93832702/245021482-f7e6f272-6c7b-4d57-ab04-919e3e620397.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MTg4MjYwNzAsIm5iZiI6MTcxODgyNTc3MCwicGF0aCI6Ii85MzgzMjcwMi8yNDUwMjE0ODItZjdlNmYyNzItNmM3Yi00ZDU3LWFiMDQtOTE5ZTNlNjIwMzk3LnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNDA2MTklMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjQwNjE5VDE5MzYxMFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTMyNDc2ZDkzM2E2YzE5NDIxY2FkMmQ3ZDNlNzAyYTY1Y2I4YzM2OTNmMWQ5NDcwNDQzNTZmMTE5NDdlYjE5NjQmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0JmFjdG9yX2lkPTAma2V5X2lkPTAmcmVwb19pZD0wIn0.D4FDz-UnmhI-9hzBLL1zugaLId_iD5y7MLDA4k6d1MI)
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