{"id":41764288,"url":"https://github.com/the-au-forml-lab/plgroup","last_synced_at":"2026-01-25T02:20:00.185Z","repository":{"id":86433628,"uuid":"593078272","full_name":"the-au-forml-lab/plgroup","owner":"the-au-forml-lab","description":"Programming Languages Reading Group information and tools.","archived":false,"fork":false,"pushed_at":"2026-01-23T19:47:54.000Z","size":1848,"stargazers_count":1,"open_issues_count":5,"forks_count":3,"subscribers_count":1,"default_branch":"main","last_synced_at":"2026-01-24T09:21:03.682Z","etag":null,"topics":["augusta-university","programming-languages","reading-time"],"latest_commit_sha":null,"homepage":"https://the-au-forml-lab.github.io/plgroup","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/the-au-forml-lab.png","metadata":{"files":{"readme":"readme.md","changelog":null,"contributing":null,"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,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2023-01-25T07:12:18.000Z","updated_at":"2026-01-23T19:47:42.000Z","dependencies_parsed_at":null,"dependency_job_id":"d5d68c52-7c7f-4d70-8c75-62699e92db64","html_url":"https://github.com/the-au-forml-lab/plgroup","commit_stats":null,"previous_names":[],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/the-au-forml-lab/plgroup","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/the-au-forml-lab%2Fplgroup","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/the-au-forml-lab%2Fplgroup/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/the-au-forml-lab%2Fplgroup/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/the-au-forml-lab%2Fplgroup/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/the-au-forml-lab","download_url":"https://codeload.github.com/the-au-forml-lab/plgroup/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/the-au-forml-lab%2Fplgroup/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28742085,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-25T01:40:51.112Z","status":"online","status_checked_at":"2026-01-25T02:00:06.841Z","response_time":113,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"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":["augusta-university","programming-languages","reading-time"],"created_at":"2026-01-25T02:20:00.128Z","updated_at":"2026-01-25T02:20:00.176Z","avatar_url":"https://github.com/the-au-forml-lab.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Programming Languages Reading Group\n\n![GitHub last commit](https://img.shields.io/github/last-commit/the-au-forml-lab/plgroup)\n[![Test changes](https://github.com/the-au-forml-lab/plgroup/actions/workflows/test.yaml/badge.svg)](https://github.com/the-au-forml-lab/plgroup/actions/workflows/test.yaml)\n\nThe Augusta University Programming Languages Reading Group is a regular meeting\nto discuss recent results in programming languages (PL) research.\nThe intent of the group is to learn about various ideas and generally broaden\nperspectives on PL research.\nEach week, members vote on a selection of papers drawn at random from top PL\nconferences.\nWe gather in person weekly to discuss the selected papers.\nThis repository contains our website and the tooling we use to select papers.\nThe PL Reading Group is organized by the\n[ΔΛΔ](https://augusta.presence.io/organization/delta-lambda-delta)\nstudent organization.\n\n## Quick start\n\n1.  [Populate](#setting-sources-for-paper-selection)\n    `data/sources.csv` with your favorite venues.\n1.  Execute `npm run update` to fetch papers from those venues.\n1.  Commit these changes to the repository.\n1.  [Enable one of the workflows](#using-the-workflows) for automatic paper\n    selection.\n\n## Everyday use\n\n### Common commands\n\n| Command                    | Effect                                                 |\n|:---------------------------|--------------------------------------------------------|\n| `npm run choose [-- n]`    | [select `n` papers randomly][choose] from the dataset  |\n| `npm run details -- \u003cDOI\u003e` | look up title and citation of the paper with given DOI |\n| `npm run set -- \u003cDOI\u003e`     | [manually set the next paper][manual]                  |\n| `npm run stats`            | print statistics about the dataset                     |\n| `npm run update`           | [update the dataset](#updating-the-dataset)            |\n\n[manual]: #manually-setting-the-next-paper\n[choose]: #getting-the-next-paper-suggestion\n\n\n### Setting sources for paper selection\n\nThe file `data/sources.csv` contains a list of conferences, one per line,\nfrom which papers are selected.\nAfter modifying this file you must\n[update the dataset](#updating-the-dataset) for the changes to take effect.\n\nEach line of `data/sources.csv` contains the `name` and `year` of a conference\nseparated by a comma, and with no additional whitespace.\nThe `name` is such that the following URL is valid on DBLP.\n``` text\nhttps://dblp.org/db/conf/\u003cname\u003e/index.html\n```\nYou can use this to discover conferences by browsing DBLP.\n\n**Notes.**\n-   Venues other than conferences (e.g. journals) are not supported at the moment.\n-   This software identifies papers by their DOI,\n    so conferences that do not register DOIs for their papers are not supported.\n\n### Filtering papers by keywords\n\nEach line of the file `data/stopwords.txt` contains a keywords to exclude during\nthe selection process.\nAny paper whose title contains (case-insensitively) any of the keywords will not\nbe suggested for reading.\n\n### Updating the dataset\n\nTo update the dataset, run `npm run update`.\nThis operation uses the existing dataset as a cache to minimize API calls.\nIf you want to rebuild the dataset from scratch, delete the file `data/papers.json`.\nBy default, papers from venues (and years) no longer listed in `data/sources.csv`\nwill be removed during the update.\nThis behavior may be changed by editing the `DATASET.KEEP_OLD_PAPERS`\n[option](#configuration-file).\n\n**Troubleshooting.** If calls to the DBLP API fail,\nyou can inspect the relevant URLs by running `npm run venues`.\n\n### Getting the next paper suggestion\n\nThe paper selection actions run on a schedule,\nbut can also be triggered manually by running the\n[configured workflow](#using-the-workflows) in [GitHub actions](./actions).\nDoing so will generate PRs with paper suggestions.\nOnly those with the appropriate repository permissions may run these workflows\nmanually.\n\nBoth workflows invoke `npm run choose` and `npm run set` in the background.\nThe command `npm run choose` takes an optional numerical parameter `n`,\nthe number of papers that should be selected.\nIf no parameter is given, it defaults to `1`.\nThis command prints prints the selected papers,\nand writes an array containing their DOIs to the file `data/choices.json`.\nOther than that, it does not modify the repository.\nThe choices are made according to the `RANDOM_POLICY` [option](#configuration-file).\n\n### Manually setting the next paper\n\nManually run the\n[set paper](https://github.com/the-au-forml-lab/plgroup/actions/workflows/set.yaml)\nworkflow with the desired paper's DOI as input.\nIf the DOI does not correspond to any paper in the dataset,\ninformation about the paper will be retrieved from the internet\nand added to the dataset.\n\nThe corresponding command is `npm run set -- \u003cDOI\u003e`.\nThis command also modifies the website files, history, etc.\n\n### Configuration file\n\nThe file `src/config.ts` contains various settings for the runtime behavior of\nthe paper selection script.\nThe effects of individual configuration options are described in the comments of\nthat file.\n\n## Semester maintenance\n\nLight maintenance is needed between semesters/reading periods.\n\n### Start of semester\n\n1.  Archive the previous semester:\n    Run the script to archive the most recent semester\n    ``` bash\n    bash archive_semester.sh \u003cSEMESTER\u003e \u003cYEAR\u003e\n    ```\n    For example `archive_semester.sh fall 2025`.\n    This script will create a new directory in `docs/_past_semesters`,\n    copy the reading group info for the past semester to that directory and\n    clear the automatically generated files in `docs/`.\n\n2.  Clear the Schedule:\n    Edit the schedule (the table at the bottom of `docs/index.md`).\n    Adjust dates, locations etc. as appropriate.\n    Fill the description colum with a placeholder.\n    By default you should use\n    ``` text\n    Paper \u003cnumber\u003e discussion\n    ```\n    If you wish to use a different placeholder,\n    [customize](#configuration-file) the variable `SCHEDULE_PLACEHOLDER_RE`\n    to a regular expression which matches your placeholder\n    (and no other part of `index.md`).\n\n3.  Edit `readme.md` to reflect information about the new semester.\n\n4.  Enable one of the paper selection [workflows](#using-the-workflows).\n\n### End of semester\n\nDisable the configured workflow.\n\n## Editing\n\n### Development commands\n\n| Command          | Effect                                                       |\n|:-----------------|--------------------------------------------------------------|\n| `npm install`    | Install [development dependencies](#editing-the-source-code) |\n| `npm run build`  | Typecheck the source code                                    |\n| `npm run serve`  | Run Jekyll for [Website development](#website-development)   |\n| `npm run venues` | Print URLs for debugging DBLP requests\n\n\n### Editing the source code\n\nTo execute the source code,\n[Node.js][nodejs] version `22.6.0` or greater is required.\nThis version added\n[native typescript execution](https://nodejs.org/en/learn/typescript/run-natively).\n\nTo work on the source code, you will need:\n\n-   the [typescript compiler](https://www.typescriptlang.org)\n-   [type declarations][definitelyTyped] for nodejs\n-   (optional) the [typescript language server][typescriptLS]\n\nRunning `npm install` will install all of the above locally in your development\ndirectory.\n\n[nodejs]: https://nodejs.org/en/download/\n[definitelyTyped]: https://github.com/DefinitelyTyped/DefinitelyTyped/tree/master\n[typescriptLS]: https://github.com/typescript-language-server/typescript-language-server\n\n### Editing the website\n\nBasic edits to the website can be performed by editing the markdown files in the\n`docs/` directory.\nFor more comprehensive edits,\nfollow the instructions at [website development](#website-development).\n\n### Editing the blog\n\nBlog posts are ordinary markdown files located in the `docs/_posts` directory.\nTheir file names are formatted as `YYYY-MM-DD-\u003cshort title\u003e.md`,\nwhere the former part is the date of the blog post.\nA template for authoring new posts is provided at `docs/_posts/template.md`.\n\n### Website development\n\nThe `docs/` directory contains files for the PL Reading Group website.\nIt is build using Jekyll and markdown.\nSubstantial edits to the website should be prototyped locally,\nwhich requires Ruby and Jekyll.\nTo install dependencies and get started with local development,\nfollow these instructions:\n\n1.   [Install Jekyll](https://jekyllrb.com/docs/installation)\n1.   `cd docs/`.\n1.   Install dependencies: `bundle install`\n1.   Run the website locally: `bundle exec jekyll serve`\n    _or_ `cd .. \u0026\u0026 npm run serve`\n1.   Preview the website on `localhost:4000/plgroup`.\n\n## Using the workflows\n\nThere are two available workflows:\n_ranked choice voting_ and _reviewer approval_.\nOnly one workflow should be enabled during a semester/reading period.\nWorkflows are controlled by variables which can be managed at\n_settings \u003e secrets and variables \u003e actions (variables)_\n\n### Workflow scheduling\n\nThe paper-selection actions run on automated schedule.\nTo change the schedule, refer to the documentation on\n[workflow schedules][workflow-schedules].\n\n[workflow-schedules]: https://docs.github.com/en/actions/using-workflows/events-that-trigger-workflows#schedule\n\n### Workflow I: ranked choice voting\n\nThis workflow generates a predefined number of random paper suggestions.\nThose suggestions are then posted to a Discord channel for voting by channel members.\nA corresponding PR is generated for each paper suggestion.\nThe vote is concluded manually by merging the winning suggestion PR.\nThe remaining PRs will be closed/discarded automatically.\nThe relevant GitHub actions are \"Vote open\" and \"Vote close\".\nThis workflow requires Discord integration to conduct voting.\n\n+   Set `DISCORD_WEBHOOK_URL` secret to direct to the intended discord channel.\n+   Set `PAPER_VOTE_ON` variable to `1` to enable voting, or `0` to disable.\n+   Set `OPTIONS` to the number of options you want to select,\n    e.g. `3` means three options.\n\n### Workflow II: participants suggest papers\n\nThis workflow functions as _ranked choice voting_ above,\nbut instead of suggesting random papers from the dataset,\nthe vote options are suggested by the reading group participants.\n\nTo suggest papers, write their DOIs (one per line) to the file `suggestions.txt`.\nThis workflow runs automatically when `suggestions.txt` is modified,\nand creates a vote option and PR for each paper specified in that file.\n\nSet `DISCORD_WEBHOOK_URL` secret to direct to the intended discord channel.\n(same as for _ranked choice voting_)\n\n### Workflow III: reviewer approval\n\nThis picks one paper at random and suggets it as the next paper.\nDesignated reviewers must approve the suggetion which comes in the form of PR.\nOnce a sufficient number of reviewers accept the suggestion, the PR is merged.\nClosing the PR without approval automatically generates a new suggestion.\nThis process repeats until a satisfactory suggestion has been found.\nThe relevant GitHub actions is \"Random paper\".\n\n+   Create a branch protection rule for `main` branch,\n    to enforce reviewer approval of a paper suggestion, in _settings \u003e branches_.\n    -   Check \"Require a pull request before merging\".\n    -   Set \"Require approvals\" count to the minimum number of reviewer required\n        to approve paper suggestion.\n+   Set `REVIEWERS` variable to a newline-separated string of GitHub usernames.\n    -   For example: `user1 \\n user2 \\n user3`\n    -   The users must have sufficient permissions to perform PR reviews.\n+   Set `PAPER_CHOOSE_ON` variable to \u003ccode\u003e1\u003c/code\u003e to enable automatic\n            suggestions.\n+   Set `AUTOMERGE_PAT` secret to a personal access token of a user with\n    repository write access, to enable auto-merging approved PRs.\n    -   Permission scopes for classic token: repo\n    -   Permission scopes for fine-grained token:\n        pull requests write and contents write.\n+   (Optional) Set `DISCORD_WEBHOOK_URL` secret to a Discord channel URL\n    to enable notifications.\n\n### Initial setup for forked repositories\n\nComplete the following steps to activate the automated actions.\n\n+   Enable workflow permissions in _settings \u003e actions \u003e general_:\n    -   choose \"Read and write permissions\"\n    -   check \"Allow GitHub Actions to create and approve pull requests\n+   Create environment secrets and variables\n    with empty default values, in _settings \u003e secrets and variables \u003e actions_:\n    -   secrets: `DISCORD_WEBHOOK_URL` and `AUTOMERGE_PAT`\n    -   variables: `PAPER_CHOOSE_ON` and `PAPER_VOTE_ON` and `REVIEWERS` and\n        `OPTIONS` and `OPTION_COUNT`\n+   Configure a paper selection workflow as described above to enable\n    automated paper suggestions.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fthe-au-forml-lab%2Fplgroup","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fthe-au-forml-lab%2Fplgroup","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fthe-au-forml-lab%2Fplgroup/lists"}