[{"data":1,"prerenderedAt":464},["Reactive",2],{"search-api":3},[4,11,16,22,27,32,37,42,47,52,59,65,72,77,82,87,92,97,103,108,113,120,125,130,136,143,148,153,159,164,169,175,180,186,191,196,202,207,212,217,222,227,232,237,242,247,252,257,262,268,273,278,284,289,295,300,306,312,317,323,328,333,339,344,350,356,362,368,373,378,383,388,394,399,404,409,415,421,426,431,436,442,453],{"id":5,"path":6,"dir":7,"title":8,"description":7,"keywords":9,"body":10},"content:0.index.md","/","","Introduction",[],"  Introduction   University of Toronto Computer Science Software Engineering",{"id":12,"path":13,"dir":7,"title":8,"description":7,"keywords":14,"body":15},"content:1.introduction.md","/introduction",[],"  Introduction   This is a group website for the Software Engineering group at the University of Toronto Computer Science department.\nContaining information about the group, its members, and its projects.",{"id":17,"path":18,"dir":19,"title":20,"description":7,"keywords":21,"body":7},"content:1.members:1.faculty:Azadeh-Farzan.md","/members/faculty/azadeh-farzan","faculty","Azadeh Farzan",[],{"id":23,"path":24,"dir":19,"title":25,"description":7,"keywords":26,"body":7},"content:1.members:1.faculty:Fan-Long.md","/members/faculty/fan-long","Fan Long",[],{"id":28,"path":29,"dir":19,"title":30,"description":7,"keywords":31,"body":7},"content:1.members:1.faculty:Marsha-Chechik.md","/members/faculty/marsha-chechik","Marsha Chechik",[],{"id":33,"path":34,"dir":19,"title":35,"description":7,"keywords":36,"body":7},"content:1.members:1.faculty:Maryam-Mehri-Dehnavi.md","/members/faculty/maryam-mehri-dehnavi","Maryam Mehri Dehnavi",[],{"id":38,"path":39,"dir":19,"title":40,"description":7,"keywords":41,"body":7},"content:1.members:1.faculty:Ningning-Xie.md","/members/faculty/ningning-xie","Ningning Xie",[],{"id":43,"path":44,"dir":19,"title":45,"description":7,"keywords":46,"body":7},"content:1.members:1.faculty:Shurui-Zhou.md","/members/faculty/shurui-zhou","Shurui Zhou",[],{"id":48,"path":49,"dir":19,"title":50,"description":7,"keywords":51,"body":7},"content:1.members:1.faculty:Xujie-Si.md","/members/faculty/xujie-si","Xujie Si",[],{"id":53,"path":54,"dir":55,"title":56,"description":57,"keywords":58,"body":7},"content:1.members:2.staff-and-postdoc:alessio-di-sandro.md","/members/staff-and-postdoc/alessio-di-sandro","staff-and-postdoc","Alessio Di Sandro","Software Engineer",[],{"id":60,"path":61,"dir":55,"title":62,"description":63,"keywords":64,"body":7},"content:1.members:2.staff-and-postdoc:aren-a-babikian.md","/members/staff-and-postdoc/aren-a-babikian","Aren A Babikian","Postdoctoral Fellow",[],{"id":66,"path":67,"dir":68,"title":69,"description":70,"keywords":71,"body":7},"content:1.members:3.grad-student:Andong-Fan.md","/members/grad-student/andong-fan","grad-student","Andong Fan","PhD Student",[],{"id":73,"path":74,"dir":68,"title":75,"description":70,"keywords":76,"body":7},"content:1.members:3.grad-student:Avery-Laird.md","/members/grad-student/avery-laird","Avery Laird",[],{"id":78,"path":79,"dir":68,"title":80,"description":70,"keywords":81,"body":7},"content:1.members:3.grad-student:Danya-Lette.md","/members/grad-student/danya-lette","Danya Lette",[],{"id":83,"path":84,"dir":68,"title":85,"description":70,"keywords":86,"body":7},"content:1.members:3.grad-student:Ethan-Bodzioney.md","/members/grad-student/ethan-bodzioney","Ethan Bodzioney",[],{"id":88,"path":89,"dir":68,"title":90,"description":70,"keywords":91,"body":7},"content:1.members:3.grad-student:Faraz-Shahsavan.md","/members/grad-student/faraz-shahsavan","Faraz Shahsavan",[],{"id":93,"path":94,"dir":68,"title":95,"description":7,"keywords":96,"body":7},"content:1.members:3.grad-student:Logan-Murphy.md","/members/grad-student/logan-murphy","Logan Murphy",[],{"id":98,"path":99,"dir":68,"title":100,"description":101,"keywords":102,"body":7},"content:1.members:3.grad-student:Maite-Kramarz.md","/members/grad-student/maite-kramarz","Maite Kramarz","MSc Student",[],{"id":104,"path":105,"dir":68,"title":106,"description":101,"keywords":107,"body":7},"content:1.members:3.grad-student:Matthew-Toohey.md","/members/grad-student/matthew-toohey","Matthew Toohey",[],{"id":109,"path":110,"dir":68,"title":111,"description":70,"keywords":112,"body":7},"content:1.members:3.grad-student:Rohith-Pudari.md","/members/grad-student/rohith-pudari","Rohith Pudari",[],{"id":114,"path":115,"dir":68,"title":116,"description":117,"keywords":118,"body":119},"content:1.members:3.grad-student:Ruotong-Cheng.md","/members/grad-student/ruotong-cheng","Ruotong Cheng","Hello there.",[],"  Hello there.",{"id":121,"path":122,"dir":68,"title":123,"description":101,"keywords":124,"body":7},"content:1.members:3.grad-student:Sky-Li.md","/members/grad-student/sky-li","Sky Li",[],{"id":126,"path":127,"dir":68,"title":128,"description":70,"keywords":129,"body":7},"content:1.members:3.grad-student:Yanning-Chen.md","/members/grad-student/yanning-chen","Yanning Chen",[],{"id":131,"path":132,"dir":68,"title":133,"description":134,"keywords":135,"body":7},"content:1.members:3.grad-student:zhiyang-chen.md","/members/grad-student/zhiyang-chen","Zhiyang Chen","PhD with Fan Long",[],{"id":137,"path":138,"dir":139,"title":140,"description":141,"keywords":142,"body":7},"content:1.members:4.alumni:aamod-kore.md","/members/alumni/aamod-kore","alumni","Aamod Kore","MSc",[],{"id":144,"path":145,"dir":139,"title":146,"description":141,"keywords":147,"body":7},"content:1.members:4.alumni:alan-wang.md","/members/alumni/alan-wang","Alan Wang",[],{"id":149,"path":150,"dir":139,"title":151,"description":141,"keywords":152,"body":7},"content:1.members:4.alumni:Ali-Raeisdanaei.md","/members/alumni/ali-raeisdanaei","Ali Raeisdanaei",[],{"id":154,"path":155,"dir":139,"title":156,"description":157,"keywords":158,"body":7},"content:1.members:4.alumni:alicia-grubb.md","/members/alumni/alicia-grubb","Alicia Grubb","PhD, Associate Professor at Smith College",[],{"id":160,"path":161,"dir":139,"title":162,"description":141,"keywords":163,"body":7},"content:1.members:4.alumni:andre-wong.md","/members/alumni/andre-wong","Andre Wong",[],{"id":165,"path":166,"dir":139,"title":167,"description":141,"keywords":168,"body":7},"content:1.members:4.alumni:ao-li.md","/members/alumni/ao-li","Ao Li",[],{"id":170,"path":171,"dir":139,"title":172,"description":173,"keywords":174,"body":7},"content:1.members:4.alumni:arie-gurfinkle.md","/members/alumni/arie-gurfinkle","Arie Gurfinkle","PhD, Professor at University of Waterloo",[],{"id":176,"path":177,"dir":139,"title":178,"description":141,"keywords":179,"body":7},"content:1.members:4.alumni:Arya-Rafii.md","/members/alumni/arya-rafii","Arya Rafii",[],{"id":181,"path":182,"dir":139,"title":183,"description":184,"keywords":185,"body":7},"content:1.members:4.alumni:aws-albarghouthi.md","/members/alumni/aws-albarghouthi","Aws Albarghouthi","PhD, Associate Professor at UW-Madison",[],{"id":187,"path":188,"dir":139,"title":189,"description":141,"keywords":190,"body":7},"content:1.members:4.alumni:benet-devereux.md","/members/alumni/benet-devereux","Benet Devereux",[],{"id":192,"path":193,"dir":139,"title":194,"description":141,"keywords":195,"body":7},"content:1.members:4.alumni:Benson-quach.md","/members/alumni/benson-quach","Benson Quach",[],{"id":197,"path":198,"dir":139,"title":199,"description":200,"keywords":201,"body":7},"content:1.members:4.alumni:boyue-hu.md","/members/alumni/boyue-hu","Boyue Hu","PhD",[],{"id":203,"path":204,"dir":139,"title":205,"description":141,"keywords":206,"body":7},"content:1.members:4.alumni:chenguang-zhu.md","/members/alumni/chenguang-zhu","Chenguang Zhu",[],{"id":208,"path":209,"dir":139,"title":210,"description":141,"keywords":211,"body":7},"content:1.members:4.alumni:cosmin-truta.md","/members/alumni/cosmin-truta","Cosmin Truta",[],{"id":213,"path":214,"dir":139,"title":215,"description":141,"keywords":216,"body":7},"content:1.members:4.alumni:danny-house.md","/members/alumni/danny-house","Danny House",[],{"id":218,"path":219,"dir":139,"title":220,"description":141,"keywords":221,"body":7},"content:1.members:4.alumni:darshanand-khusial.md","/members/alumni/darshanand-khusial","Darshanand Khusial",[],{"id":223,"path":224,"dir":139,"title":225,"description":141,"keywords":226,"body":7},"content:1.members:4.alumni:dimi-paun.md","/members/alumni/dimi-paun","Dimi Paun",[],{"id":228,"path":229,"dir":139,"title":230,"description":141,"keywords":231,"body":7},"content:1.members:4.alumni:federico-mora.md","/members/alumni/federico-mora","Federico Mora",[],{"id":233,"path":234,"dir":139,"title":235,"description":141,"keywords":236,"body":7},"content:1.members:4.alumni:golnaz-ghasemi.md","/members/alumni/golnaz-ghasemi","Golnaz Ghasemi",[],{"id":238,"path":239,"dir":139,"title":240,"description":141,"keywords":241,"body":7},"content:1.members:4.alumni:greg-brunet.md","/members/alumni/greg-brunet","Greg Brunet",[],{"id":243,"path":244,"dir":139,"title":245,"description":141,"keywords":246,"body":7},"content:1.members:4.alumni:hossein-ghotbaddini.md","/members/alumni/hossein-ghotbaddini","Hossein Ghotbaddini",[],{"id":248,"path":249,"dir":139,"title":250,"description":141,"keywords":251,"body":7},"content:1.members:4.alumni:Huakun-Shen.md","/members/alumni/huakun-shen","Huakun Shen",[],{"id":253,"path":254,"dir":139,"title":255,"description":141,"keywords":256,"body":7},"content:1.members:4.alumni:ioanna-stavropoulou.md","/members/alumni/ioanna-stavropoulou","Ioanna Stavropoulou",[],{"id":258,"path":259,"dir":139,"title":260,"description":141,"keywords":261,"body":7},"content:1.members:4.alumni:jan-gozny.md","/members/alumni/jan-gozny","Jan Gozny",[],{"id":263,"path":264,"dir":139,"title":265,"description":266,"keywords":267,"body":7},"content:1.members:4.alumni:jocelyn-simmonds.md","/members/alumni/jocelyn-simmonds","Jocelyn Simmonds","PhD, Assistant Professor at the University of Chile",[],{"id":269,"path":270,"dir":139,"title":271,"description":141,"keywords":272,"body":7},"content:1.members:4.alumni:jonathan-amir.md","/members/alumni/jonathan-amir","Jonathan Amir",[],{"id":274,"path":275,"dir":139,"title":276,"description":141,"keywords":277,"body":7},"content:1.members:4.alumni:jonathan-eidelman.md","/members/alumni/jonathan-eidelman","Jonathan Eidelman",[],{"id":279,"path":280,"dir":139,"title":281,"description":282,"keywords":283,"body":7},"content:1.members:4.alumni:julia-rubin.md","/members/alumni/julia-rubin","Julia Rubin","PhD, Associate Professor at the University of British Columbia",[],{"id":285,"path":286,"dir":139,"title":287,"description":141,"keywords":288,"body":7},"content:1.members:4.alumni:kelvin-ku.md","/members/alumni/kelvin-ku","Kelvin Ku",[],{"id":290,"path":291,"dir":139,"title":292,"description":293,"keywords":294,"body":7},"content:1.members:4.alumni:lina-marsso.md","/members/alumni/lina-marsso","Lina Marsso","Post Doc, Assistant Professor at Polytechnique Montréal",[],{"id":296,"path":297,"dir":139,"title":298,"description":141,"keywords":299,"body":7},"content:1.members:4.alumni:mehrnaz-najafi.md","/members/alumni/mehrnaz-najafi","Mehrnaz Najafi",[],{"id":301,"path":302,"dir":139,"title":303,"description":304,"keywords":305,"body":7},"content:1.members:4.alumni:michail-famelis.md","/members/alumni/michail-famelis","Michail Famelis","PhD, Associate Professor at the University of Montreal",[],{"id":307,"path":308,"dir":139,"title":309,"description":310,"keywords":311,"body":7},"content:1.members:4.alumni:mihaela-bobaru.md","/members/alumni/mihaela-bobaru","Mihaela Bobaru","PhD, Research Scientist at Jet Propulsion Laboratory",[],{"id":313,"path":314,"dir":139,"title":315,"description":141,"keywords":316,"body":7},"content:1.members:4.alumni:mike-maksimov.md","/members/alumni/mike-maksimov","Mike Maksimov",[],{"id":318,"path":319,"dir":139,"title":320,"description":321,"keywords":322,"body":7},"content:1.members:4.alumni:Nick-Feng.md","/members/alumni/nick-feng","Nick Feng","PhD, Applied Scientist at AWS",[],{"id":324,"path":325,"dir":139,"title":326,"description":141,"keywords":327,"body":7},"content:1.members:4.alumni:nick-fung.md","/members/alumni/nick-fung","Nick Fung",[],{"id":329,"path":330,"dir":139,"title":331,"description":200,"keywords":332,"body":7},"content:1.members:4.alumni:nilloofar-razavi.md","/members/alumni/nilloofar-razavi","Nilloofar Razavi",[],{"id":334,"path":335,"dir":139,"title":336,"description":337,"keywords":338,"body":7},"content:1.members:4.alumni:ou-wei.md","/members/alumni/ou-wei","Ou Wei","PhD, Assistant Professor at Nanjing University of Aeronautics and Astronautic",[],{"id":340,"path":341,"dir":139,"title":342,"description":141,"keywords":343,"body":7},"content:1.members:4.alumni:pooya-saadat-panah.md","/members/alumni/pooya-saadat-panah","Pooya Saadat Panah",[],{"id":345,"path":346,"dir":139,"title":347,"description":348,"keywords":349,"body":7},"content:1.members:4.alumni:ramy-shahin.md","/members/alumni/ramy-shahin","Ramy Shahin","PhD, Senior Applied Scientist at AWS",[],{"id":351,"path":352,"dir":139,"title":353,"description":354,"keywords":355,"body":7},"content:1.members:4.alumni:sahar-kokaly.md","/members/alumni/sahar-kokaly","Sahar Kokaly","PhD, Senior Software Safety Engineer at General Motors",[],{"id":357,"path":358,"dir":139,"title":359,"description":360,"keywords":361,"body":7},"content:1.members:4.alumni:shiva-nejati.md","/members/alumni/shiva-nejati","Shiva Nejati","PhD, Associate Professor at University of Ottawa",[],{"id":363,"path":364,"dir":139,"title":365,"description":366,"keywords":367,"body":7},"content:1.members:4.alumni:Sidi-Mohamed-Beillahi.md","/members/alumni/sidi-mohamed-beillahi","Sidi Mohamed Beillahi","Post Doc",[],{"id":369,"path":370,"dir":139,"title":371,"description":141,"keywords":372,"body":7},"content:1.members:4.alumni:Steven-Zhong.md","/members/alumni/steven-zhong","Steven Zhong",[],{"id":374,"path":375,"dir":139,"title":376,"description":141,"keywords":377,"body":7},"content:1.members:4.alumni:Tsung-Ju-Chiang.md","/members/alumni/tsung-ju-chiang","Tsung Ju Chiang",[],{"id":379,"path":380,"dir":139,"title":381,"description":321,"keywords":382,"body":7},"content:1.members:4.alumni:victor-nicolet.md","/members/alumni/victor-nicolet","Victor Nicolet",[],{"id":384,"path":385,"dir":139,"title":386,"description":141,"keywords":387,"body":7},"content:1.members:4.alumni:vincent-hui.md","/members/alumni/vincent-hui","Vincent Hui",[],{"id":389,"path":390,"dir":139,"title":391,"description":141,"keywords":392,"body":393},"content:1.members:4.alumni:vladyslav-nekriach.md","/members/alumni/vladyslav-nekriach","Vladyslav Nekriach",[],"    Vladyslav Nekriach   Hi! I'm a MASc student at the UofT ECE department and I'm jointly supervised by Prof. Fan Long from DCS UofT and Prof. Andreas Veneris from ECE UofT. My research interests span distributed systems, blockchain and finance. In my spare time, I usually go to the gym, listen to music or play the guitar; currently learning how to use a DJ controller!",{"id":395,"path":396,"dir":139,"title":397,"description":141,"keywords":398,"body":7},"content:1.members:4.alumni:wei-bo-hsu.md","/members/alumni/wei-bo-hsu","Wei Bo Hsu",[],{"id":400,"path":401,"dir":139,"title":402,"description":141,"keywords":403,"body":7},"content:1.members:4.alumni:wei-ding.md","/members/alumni/wei-ding","Wei Ding",[],{"id":405,"path":406,"dir":139,"title":407,"description":141,"keywords":408,"body":7},"content:1.members:4.alumni:winnie-lai.md","/members/alumni/winnie-lai","Winnie Lai",[],{"id":410,"path":411,"dir":139,"title":412,"description":413,"keywords":414,"body":7},"content:1.members:4.alumni:yi-li.md","/members/alumni/yi-li","Yi Li","PhD, Assistant Professor at Nanyang Technological University",[],{"id":416,"path":417,"dir":139,"title":418,"description":419,"keywords":420,"body":7},"content:1.members:4.alumni:yi-zhao.md","/members/alumni/yi-zhao","Yi Zhao","MscAc",[],{"id":422,"path":423,"dir":139,"title":424,"description":141,"keywords":425,"body":7},"content:1.members:4.alumni:youssef-zaky.md","/members/alumni/youssef-zaky","Youssef Zaky",[],{"id":427,"path":428,"dir":139,"title":429,"description":141,"keywords":430,"body":7},"content:1.members:4.alumni:youzhang-sun.md","/members/alumni/youzhang-sun","Youzhang Sun",[],{"id":432,"path":433,"dir":139,"title":434,"description":141,"keywords":435,"body":7},"content:1.members:4.alumni:yuan-gan.md","/members/alumni/yuan-gan","Yuan Gan",[],{"id":437,"path":438,"dir":139,"title":439,"description":440,"keywords":441,"body":7},"content:1.members:4.alumni:zachary-kincaid.md","/members/alumni/zachary-kincaid","Zachary Kincaid","PhD, Associate Professor at Princeton",[],{"id":443,"path":444,"dir":445,"title":446,"description":7,"keywords":447,"body":452},"content:3.documentation:contributor.md","/documentation/contributor","documentation","Contributor",[448,449,450,451],"Project Setup","Add A New Member","Editing Your Content","Pull Request","  Contributor  Project Setup  If you want to preview the changes locally, you will need to setup the project locally. Adding or editing a new member doesn't require setting up the project locally, simply modify markdown files in   content/1.members  directory.  You will need to install nodejs and run the project with a package manager. Nodejs comes with   npm , you can use it. But I recommend    bun  as it's much faster.      bun   install       # install dependencies   bun   dev           # start dev server   bun   generate      # generate static files     npm   install   npm   run   dev   npm   run   generate     yarn   install   yarn   dev   yarn   generate     pnpm   install   pnpm   dev   pnpm   generate  Add A New Member  Go to   content/1.members  directory, based on the member's role, add a new markdown file in the corresponding directory. For example, if you want to add a new faculty member, you should add a new markdown file in   content/1.members/faculty  directory. The markdown file should have the following format:     ---   name  :   Huakun Shen   description  :   Master Student   avatar  :   https://github.com/HuakunShen.png   website  :   https://huakunshen.com   # website: /members/grad-student/huakun-shen   email  :   huakun.shen@huakunshen.com   year  :   2023   # necessary for an alumni   ---    Anything about yourself.   Only   name  field is necessary, other fields are all optional.   For alumnis,   year  field is necessary as it will be used to sort alumnis by year.  Avatar  It can be a remote image, or a local image. If it's a local image, you should put it in   public/avatar  directory, and use the relative path as the value of   avatar  field. For example, if you put the image in   public/avatar/shen.png , then the value of   avatar  field should be   /avatar/shen.png .  Website  If you include the   website  field, clicking on your avatar will link to the website you specified.  Otherwise it by default will link to your profile on this website.   More Details  For the   website  field, you can put a complete url that start with   https:// , or use a relative path to link to your profile on this website in case you don't have a website yet.  For example, if you want to link to   https://huakunshen.com , you can put   https://huakunshen.com  or   /members/grad-student/huakun-shen  as the value of   website  field.  The relative path is just the file path of your markdown file relative to the   content  folder (but without the numbers, the numbers is only for sorting). For example, if your markdown file is at   content/1.members/3.grad-student/Huakun-Shen.md , then the relative path is   /members/grad-student/huakun-shen .  However, the website has been configured to auto link to your profile on this website if a   website  field is not specified. So you can just leave it blank if you don't have a website yet.  Content  You can add more details about yourself in the markdown file if you want. Standard markdown syntax is fully supported.  This site is built with    @nuxt/content  and    docus  theme, which gives you more flexibility to customize the content and styling. In markdown, you can write   html  and   css .   TailwindCSS  is supported to make styling easier.  For example   \u003Cspan class=\"bg-red-300\">Hello World\u003C/span>  gives you   Hello World .  Editing Your Content  Simple content modification can be done fully in browser without a dev environment. In the documentation page, there is a \"Edit this page\" button at the bottom of the page. Click it to edit the markdown file of the current page.  Pull Request  Fork this repo, make changes, and submit a pull request. The maintainer will merge your changes if everything looks good.   It is recommended you run the development server locally to make sure your changes look good and doesn't break anything.  If you don't want to setup a local environment, you can also use cloud dev env in browser after forking it. Here are some sample services.  Codesandbox  Or simply edit your github url to    https://github  box .com/your-github-username/website  to open it in codesandbox.  For example, I forked this repo to   https://github.com/HuakunShen/ut-prose-group-website , then I can open it in codesandbox with   https://githubbox.com/HuakunShen/ut-prose-group-website .  Gitpod  Prepend   gitpod.io/#  to your github repo url to open it in gitpod.    gitpod.io/#  https://github.com/HuakunShen/ut-prose-group-website  Stackblitz  After making changes on a fork, open it in stackblitz with the following url. (replace the username and repo name)   https://stackblitz.com/fork/github/HuakunShen/ut-prose-group-website   https://stackblitz.com/fork/github/  /   html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"id":454,"path":455,"dir":445,"title":456,"description":457,"keywords":458,"body":463},"content:3.documentation:developer.md","/documentation/developer","Notes for Developer","For developer who needs to maintain this site.",[459,460,461,462],"Tech Stack","Project Structure","Deployment","CICD","  Notes for Developer  For developer who needs to maintain this site.  Tech Stack   Changing content only requires editing Markdown files.  If a developer needs to fully understand and maintain this site, he/she needs to be familiar with the following tech stack.   JavaScript and TypeScript   Vue.js : A Progressive JavaScript Framework for building web interfaces   Nuxt : (A metaframework based on Vue.js with more functionalities)   TailwindCSS  (A utility-first CSS framework. One can customize the style using class names, without touching CSS)    @nuxt/content : A nuxt module for managing content with Markdown files.    docus : A nuxt theme for documentation sites based on   @nuxt/content   This theme simplifies the process of building this website, as it comes with nice-looking layout and styling, a documentation-style sidebar, and a search bar.  CICD: GitHub Action\n   Used for auto building and auto releasing the static site.  Read more in   CICD  section.   Shacn Vue   As of now, the site has been very simple, no ui library has been used. But in case in the future we need to use a ui library, I've added a popular ui library based on Tailwind called   Shacn Vue .  Project Structure   The root page is   pages/index.vue .   components/  directory contains all the components used in this site, such as how a member is displayed and how members are listed.  All content is in   content  directory.\n     @nuxt/content  allows querying the markdown files as a database.  The documentation page basically mirrors the directory structure of   content/  on file system. Markdown files in this folder will be rendered as HTML pages and searchable. Read   @nuxt/content/markdown  for advanced usage such as hiding a page in production build.  The hooks for loading members from markdown files are in   composables/members-query.ts .\n   Read   @nuxt/content/query-content  for how it works.  Deployment   Nuxt  is a metaframework designed with SSR (server-side rendering) in mind. However, since this site will be deployed on   cs.toronto.edu , it needs to build compiled into a static site with SSG (static site generation) mode. Read   static hosting  for more details.  Basically, instead of   npm run build , we need to run   npm run generate  to generate static files. The static files will be generated in   .output/public  directory. Use   npx serve .output/public  to start a local server to preview the static site.  Then we can copy the files in   .output/public  directory to   cs.toronto.edu  server to deploy the site.  Read more about how to get the auto-generated static site files in   CICD  section.  CICD  GitHub Action   .github/ci.yml  is used to auto build the static site. This workflow is run for every push and pull request. It is only used to verify that the changes won't prevent the site from building. It will not deploy the site or generate a release. Maintainers should only merge pull requests after this workflow passes.  GitHub Action   .github/auto-release.yml  will generate a new release for every commit to the   main  branch, with generated static site files as release asset. The asset is named   static_website.tar.gz .  Releases can be found at   https://github.com/ProSE-uoft-org/group-website/releases  The latest release is at   https://github.com/ProSE-uoft-org/group-website/releases/latest   https://api.github.com/repos/ProSE-uoft-org/group-website/releases/latest  gives us the latest release info in JSON format. We can use this to get the download URL of the latest release asset.  A script is provided in   scripts/download_latest_release.sh , it will download the latest release asset to   static_website.tar.gz .    Note about this script   This script requires   jq  command installed.   jq  is a command-line JSON processor, installed by default on Ubuntu, but not MacOS. Use   brew install jq  to install it on MacOS.  Here is the script for reference:     #!/bin/bash   USERNAME  =  \"ProSE-uoft-org\"   REPO  =  \"group-website\"   ASSET_NAME  =  \"static_website.tar.gz\"    # Get the download URL for the asset   DOWNLOAD_URL  =  $(  curl   -s   \"https://api.github.com/repos/  $USERNAME  /  $REPO  /releases/latest\"   |   jq   -r   '.assets[] | select(.name == \"'  $ASSET_NAME  '\") | .browser_download_url')   echo   $DOWNLOAD_URL   if   [   -n   \"  $DOWNLOAD_URL  \"   ];   then       rm   $ASSET_NAME       echo   \"Downloading   $ASSET_NAME  ...\"       # Download the asset using curl       curl   -LJO   -H   'Accept: application/octet-stream'   \"  $DOWNLOAD_URL  \"   else       echo   \"Asset   $ASSET_NAME   not found in the latest release.\"   fi  html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",1771430510829]