{"id":36443003,"url":"https://github.com/beebeeoii/lominus","last_synced_at":"2026-01-11T22:00:42.094Z","repository":{"id":45094321,"uuid":"433329660","full_name":"Beebeeoii/lominus","owner":"Beebeeoii","description":"NUS Canvas file sync","archived":false,"fork":false,"pushed_at":"2025-01-12T12:13:10.000Z","size":9471,"stargazers_count":63,"open_issues_count":10,"forks_count":9,"subscribers_count":3,"default_branch":"master","last_synced_at":"2025-01-12T13:22:12.024Z","etag":null,"topics":["canvas","files","go","golang","luminus","nus","sync"],"latest_commit_sha":null,"homepage":"","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Beebeeoii.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2021-11-30T07:09:48.000Z","updated_at":"2025-01-12T12:13:14.000Z","dependencies_parsed_at":"2024-06-19T02:41:22.271Z","dependency_job_id":"d709b4ed-a54e-4a5d-9a6e-349d64d5d35d","html_url":"https://github.com/Beebeeoii/lominus","commit_stats":null,"previous_names":[],"tags_count":16,"template":false,"template_full_name":null,"purl":"pkg:github/Beebeeoii/lominus","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Beebeeoii%2Flominus","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Beebeeoii%2Flominus/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Beebeeoii%2Flominus/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Beebeeoii%2Flominus/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Beebeeoii","download_url":"https://codeload.github.com/Beebeeoii/lominus/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Beebeeoii%2Flominus/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28324832,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-11T18:42:50.174Z","status":"ssl_error","status_checked_at":"2026-01-11T18:39:13.842Z","response_time":60,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["canvas","files","go","golang","luminus","nus","sync"],"created_at":"2026-01-11T22:00:41.109Z","updated_at":"2026-01-11T22:00:42.079Z","avatar_url":"https://github.com/Beebeeoii.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cp align=\"center\"\u003e\n  \u003cimg src=\"./assets/app-icon.png\" alt=\"lominus-app-icon\" width=\"196\" /\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"https://img.shields.io/badge/Lominus-v2.1.0-blueviolet\" /\u003e\n  \u003cimg src=\"https://img.shields.io/github/downloads/beebeeoii/lominus/total\" /\u003e\n  \u003cimg src=\"https://img.shields.io/github/go-mod/go-version/beebeeoii/lominus\" /\u003e\n  \u003ca href=\"https://pkg.go.dev/github.com/beebeeoii/lominus\"\u003e\n    \u003cimg src=\"https://pkg.go.dev/badge/github.com/beebeeoii/lominus.svg\" alt=\"Go Reference\"\u003e\n  \u003c/a\u003e\n\u003c/p\u003e\n\n![image](./screenshots/lominus-demo.gif)\n\n# Table of Contents\n\n1. [About](#about)\n2. [Features](#features)\n3. [Getting Started](#getting-started)\n    - [Installation](#getting-started-installation)\n        - [Windows](#getting-started-installation-windows)\n        - [macOS](#getting-started-installation-mac)\n        - [Linux](#getting-started-installation-linux)\n    - [Building](#getting-started-building)\n        - [Pre-requisites](#getting-started-building-prerequisites)\n        - [Build](#getting-started-building-build)\n    - [API](#getting-started-api)\n        - [Example: Retrieving modules](#getting-started-api-example)\n        - [Example: Sample Output](#getting-started-api-example-output)\n4. [Integrations](#integrations)\n5. [Screenshots](#screenshots)\n6. [Contributing](#contributing)\n\n# About \u003ca name=\"about\"\u003e\n\nLominus is a tool written in Go to automatically sync [Canvas](https://canvas.nus.edu.sg/) files onto your local storage for easy access to updated files. It runs on Windows, macOS and Linux.\n\n**No credentials, files, or any other form of information is uploaded to any servers. Everything is stored locally on your system. Credentials are only used for authentication.**\n\n# Features \u003ca name=\"features\"\u003e\n\nLominus removes the hassle to download (or redownload) whenever files are uploaded (or updated). And many more!\n\n- Works with Canvas (New !)\n- Keeps files updated and organised\n- Automatic download of module files\n- Automatic update of module files when files are reuploaded\n- System notifications\n- System-based dark/light mode\n- System tray icon\n- Telegram integration\n- API\n\n# Getting Started \u003ca name=\"getting-started\"\u003e\n\n## Installation \u003ca name=\"getting-started-installation\"\u003e\n\nUnsigned standalone executables for Windows, macOS and Linux are available from [releases](https://github.com/beebeeoii/lominus/releases).\n\n**Note**: Please read through installation introduction for the respective operating systems below.\n\n### Windows \u003ca name=\"getting-started-installation-windows\"\u003e\n\n\u003e Tested on Windows 10 Home Version 10.0.19044 Build 19044\n\nYour anti-virus software like Windows Defender may prompt that `lominus.exe` as a false positive. You may need to make an exception for it.\n\nThis occurs because the app is unsigned amongst other reasons regarding Go executables which you may find out more [here](https://go.dev/doc/faq#virus). Signing it requires a valid certificate which is payable.\n\n### macOS \u003ca name=\"getting-started-installation-mac\"\u003e\n\n\u003e Tested on M1 MacBook Air 2020 macOS Monterey Version 12.1\n\nYou may receive the prompt\n\n\u003e “Lominus” is damaged and can’t be opened. You should eject the disk image.\n\nor\n\n\u003e The app is from an unidentified developer.\n\nThis happens because the app is unsigned. Signing it requires a valid certificate which requires a valid Apple Developer Program membership.\n\nTo enable exception for this app\n\n``` bash\nxattr -cr [filepath]\n```\n\nwhere `[filepath]` is the path to the `.dmg` file.\n\n### Linux \u003ca name=\"getting-started-installation-linux\"\u003e\n\n\u003e Tested on Ubuntu Focal 20.04.2 LTS and Arch\n\nDownload and extract the tarball\n\n``` bash\ntar -xf [filename].tar.xz\n```\n\nInstall the application\n\n``` bash\nsudo make install\n```\n\n## Building \u003ca name=\"getting-started-building\"\u003e\n\n### Prerequisites \u003ca name=\"getting-started-building-prerequisites\"\u003e\n\n1. [Golang \u003e= 1.18](https://go.dev/dl/)\n\n2. `gcc`\n\n3. `gtk3` and `libayatana-appindicator3-dev` (Linux)\n\n    - For Debian and Ubuntu, you may install these via\n\n        ``` bash\n        sudo apt-get install gcc libgtk-3-dev libayatana-appindicator3-dev\n        ```\n\n    - If you are on Linux Mint, you will require `libxapp-dev` as well.\n \n 4. `libxxf86vm-dev` might help if Lominus keeps crashing on startup\n\n### Build \u003ca name=\"getting-started-building-build\"\u003e\n\n1. Ensure `GOPATH` is set in your system env\n\n    ``` bash\n    export GOPATH=$HOME/go\n    ```\n\n2. Install dependencies in the directory where you cloned\n\n    ``` bash\n    go install\n    ```\n\n3. Install [fyne](https://developer.fyne.io/index.html)\n\n    ``` bash\n    go install fyne.io/fyne/v2/cmd/fyne@latest\n    ```\n\n4. Ensure that your system `PATH` contains `$GOPATH/bin` before building.\n\n    ``` bash\n    export PATH=$GOPATH/bin:$PATH\n    fyne package\n    ```\n\n## API \u003ca name=\"getting-started-api\"\u003e\n\nLominus can also be used as an API. Please visit [documentations](https://pkg.go.dev/github.com/beebeeoii/lominus) for more details.\nHowever, do note that the documentations are lacking after v2.0.0 update due to lack of time :(. This should be fixed in due time.\n\n### Example: Retrieving your modules \u003ca name=\"getting-started-api-example\"\u003e\n\n```go\npackage main\n\nimport (\n    \"log\"\n\n    \"github.com/beebeeoii/lominus/pkg/api\"\n    \"github.com/beebeeoii/lominus/pkg/auth\"\n    \"github.com/beebeeoii/lominus/pkg/constants\"\n)\n\nfunc getCanvasModules() {\n    canvasToken := \"your-canvas-token\"\n\n    modulesReq, modReqErr := api.BuildModulesRequest(canvasToken, constants.Canvas)\n    if modReqErr != nil {\n        log.Fatalln(modReqErr)\n    }\n\n    modules, modulesErr := modulesReq.GetModules()\n    if modulesErr != nil {\n        log.Fatalln(modulesErr)\n    }\n\n    for _, module := range modules {\n        log.Println(module.ModuleCode, module.Name)\n    }\n}\n\n```\n\n### Sample output \u003ca name=\"getting-started-api-example-output\"\u003e\n\n``` terminal\n2021/12/09 12:51:49 CP1002 School of Computing Placement Test: Programming Methodology\n2021/12/09 12:51:49 CS2100 Computer Organisation\n2021/12/09 12:51:49 IDRES2021 Advancing Interdisciplinary Education in Singapore\n2021/12/09 12:51:49 IS1103 Ethics in Computing\n2021/12/09 12:51:49 MA2001 Linear Algebra I\n2021/12/09 12:51:49 MA2002 Calculus\n2021/12/09 12:51:49 SOCT101 SoC Teaching Workshop\n```\n\n# Integrations \u003ca name=\"integrations\"\u003e\n\n## Telegram\n\nTelegram can be used to receive notifications for things such as new grades releases.\n\n### Setting up\n\n1) Retrieve your _bot token_ via [BotFather](https://telegram.me/BotFather).\n\n2) Retrieve your _Telegram user ID_. The simplest way is via [UserInfoBot](https://telegram.me/userinfobot).\n\n3) Copy and paste the _bot token_ and your _Telegram user ID_ in Lominus, under the Integrations tab.\n\n4) Save and you should receive a test message from your bot.\n\n\u003e Ensure that the bot is able to message you by dropping it a message.\n\n# Screenshots \u003ca name=\"screenshots\"\u003e\n\nClick [here](./screenshots/SCREENSHOTS.md) for more screenshots\n\n| Credentials | Integrations | Preferences |\n| :---------: | :----------: | :---------: |\n| ![image](./screenshots/main-light-1.png) | ![image](./screenshots/main-light-2.png) | ![image](./screenshots/main-light-3.png) |\n| ![image](./screenshots/main-dark-1.png) | ![image](./screenshots/main-dark-2.png) | ![image](./screenshots/main-dark-3.png) |\n\n# Contributing \u003ca name=\"contributing\"\u003e\n\nLominus is far from perfect. All contributions, regardless large or small, are highly encouraged as this would help to make Lominus better. Please submit an [issue](https://github.com/beebeeoii/lominus/issues) or fork this repo and submit a [pull request](https://github.com/beebeeoii/lominus/pulls) if necessary.\n\n# FAQ\n\n1. Will my annotated lecture notes be overwritten if there exists a newer version uploaded by the Professor?\n\n    - Your annotated file will be renamed to `[v1] XXX.XXX` and the newer version will be downloaded.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbeebeeoii%2Flominus","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fbeebeeoii%2Flominus","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbeebeeoii%2Flominus/lists"}