{"id":15056307,"url":"https://github.com/erlang/erlang-org","last_synced_at":"2025-04-05T00:08:38.992Z","repository":{"id":37484281,"uuid":"75631778","full_name":"erlang/erlang-org","owner":"erlang","description":"The erlang.org website","archived":false,"fork":false,"pushed_at":"2025-04-03T01:49:02.000Z","size":227591,"stargazers_count":74,"open_issues_count":14,"forks_count":57,"subscribers_count":16,"default_branch":"master","last_synced_at":"2025-04-03T02:34:19.727Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"https://www.erlang.org","language":"HTML","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/erlang.png","metadata":{"files":{"readme":"README.md","changelog":"news.html","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":"security.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2016-12-05T14:20:52.000Z","updated_at":"2025-03-19T09:04:18.000Z","dependencies_parsed_at":"2024-04-23T09:10:38.359Z","dependency_job_id":"fa5e623f-151e-461e-a4aa-ebdb7dae6d3e","html_url":"https://github.com/erlang/erlang-org","commit_stats":{"total_commits":617,"total_committers":48,"mean_commits":"12.854166666666666","dds":0.2755267423014587,"last_synced_commit":"6530e8266cabfba9fda32b00e5136df3b2ea97b6"},"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/erlang%2Ferlang-org","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/erlang%2Ferlang-org/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/erlang%2Ferlang-org/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/erlang%2Ferlang-org/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/erlang","download_url":"https://codeload.github.com/erlang/erlang-org/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":247266564,"owners_count":20910836,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","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":[],"created_at":"2024-09-24T21:49:50.562Z","updated_at":"2025-04-05T00:08:38.971Z","avatar_url":"https://github.com/erlang.png","language":"HTML","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Erlang.org\n\n[![Netlify Status](https://api.netlify.com/api/v1/badges/dedfbd28-2e3c-4c37-a08e-7b7a580eb43a/deploy-status)](https://app.netlify.com/sites/erlang-org-garazdawi/deploys)\n\nThis is the repository for the erlang.org website.\n\nWe use [ruby] w/ [jekyll], [nodejs] w/ [bootstrap 5], and Erlang to build this website.\n\nTo launch a local copy, install the correct [prerequisites](#Prerequisites) and do `make serve` and navigate to http://localhost:4000.\n\nYou can view the deployed version here: \u003chttps://www.erlang.org\u003e\n\n[ruby]: https://www.ruby-lang.org/en/\n[jekyll]: https://jekyllrb.com/\n[nodejs]: https://nodejs.org\n[bootstrap 5]: https://getbootstrap.com/docs/5.0/\n\n## Makefile\n\nThe makefile supports these targets\n\n* build (default) - depends on setup\n  * Builds the entire site under `_site` for exporting\n* serve - depends on setup\n  * start jekyll to serve the erlang.org site at http://localhost:4000\n* setup\n  * Download and generate all [Auto-generated Content](#Auto-generated-content).\n* test - depends on setup\n  * Runs linting and all testcases\n\n### Devcontainer / gitpod.io\n\nThis project can be run as a vscode devcontainer and/or in gitpod.io.\n\nTo work with this project in gitpod go to: \u003chttps://gitpod.io/#https://github.com/erlang/erlang-org/\u003e\n\nFor instructions on how to run with vscode devcontainers see: \u003chttps://code.visualstudio.com/docs/remote/containers\u003e\n\n## Adding content\n\nMost pages are either html or markdown pages so they can be edited directly. They\nare located in the at the same place as the URL. So, for instance, the `/about` URL\nis implemented by [/about.md](/about.md) and `/community/euc` is implemented in\n[/community/euc](/community/euc.md).\n\nThere are three major [collections](https://jekyllrb.com/docs/collections/) that\nyou can add new items to: [News], [Blog] and [Release]. Each of these are\nmarkdown files found in _news, _posts and _releases respectively. There is a\nREADME file in each of those folders that describe the mandatory front matter\nfor each item.\n\nThe markdown dialect used is [github flavored markdown](https://github.github.com/gfm/).\n\nThere are also two yaml data files that contain the [documentation] and [community] links.\n\n[News]: /_news/README.md\n[Blog]: /_posts/README.md\n[Release]: /_releases/README.md\n[documentation]: [/_data/doc-links.yaml]\n[community]: [/_data/community-links.yaml]\n\n## Auto-generated content\n\nWhen doing `make setup` the auto-generated content is created. All auto-generated\ncontent is cached on github in order to speed up the netlify build. \n\n### EEPs\n\nThis is placed under `_eeps`.\n\nClone \u003chttps://github.com/erlang/eep\u003e then parse using [format-eeps.erl]. We do not use\nthe perl markdown formatter for EEPs as the html produced does not look very nice.\n\n[format-eeps.erl]: _scripts/src/format-eeps.erl\n\n### FAQ\n\nThis is placed under `faq`.\n\nClone \u003chttps://github.com/matthiasl/Erlang-FAQ\u003e and then build it.\n\n### Patches\n\nThis is placed under `_data/release.json` and `_patches`.\n\nWe fetch the latest [otp_versions.table] and from there use the [Github API](https://docs.github.com/en/rest)\nand use erlang.org rsync to fetch information about each patch released since OTP-17.0.\n\nThe files in `_patches` and `_data/release.json` contain a lot of duplicate information. We could have kept the\n`_data/release.json` as the only place to keep the data, but we didn't as doing lookups in it turned out to\nbe too slow for jekyll.\n\n[otp_versions.table]: https://github.com/erlang/otp/blob/master/otp_versions.table\n\n### Documentation\n\nThis is placed under `docs`.\n\nThe latest documentation for each release since OTP-17 is downloaded+flattened and put into the `docs` folder.\nThe documentation is not built from scratch but rather fetched from github releases or erlang.org.\n\nThe documentation in `docs/doc` is modified to have the algolia search functionality inserted into it.\n\n## Algolia\n\nWe have an agreement with algolia that they run a scraper that goes through our\ndocumentation and provides search results from that. We use a customized\n[Algolia Crawler] that crawls the documentation at www.erlang.org/doc once every week.\n\nFor the search widget we use [docsearch v3], which is a small react widget.\n\nAt the moment there is (as far as I know) no good way for a anybody else to\noptimize the search results as the crawler and index config is inside my (@garazdawi)\naccount and not available outside. So if you want to attempt to make the search \nbetter results, you should contact me and we'll have to work together to improve\nthings.\n\nGetting good results from the search is hard, so maybe we should\nimplement a way to make sure that `lists:map` is recognized as a module\nand function. However, our react skills are not there yet so this will\nhave to do for now.\n\n[Algloia Crawler]: https://www.algolia.com/doc/tools/crawler/getting-started/overview/\n[docsearch v3]: https://docsearch.algolia.com/docs/DocSearch-v3\n\n## Prerequisites\n\nYou need to have the following tools installed to build the erlang.org site:\n\n* GNU make 4.1\n* ruby 3.3.0\n* bundler 2.5.6\n* nodejs 22.14.0\n* erlang 26 and 27\n* xsltproc\n* jq 1.6\n* asdf 0.15\n\nMost likely others versions of these tools will work, but they have not been tested.\n\nIf you want to be sure that you use the correct version of the dependencies you can either\nuse the [devcontainer](#devcontainer--gitpodio) or [asdf](https://asdf-vm.com/).\n\n### Using asdf\n\nTo install and use asdf follow their [Getting started guide](https://asdf-vm.com/guide/getting-started.html). On Linux using bash in a nutshell you do this:\n\n```shell\ngit clone https://github.com/asdf-vm/asdf.git ~/.asdf --branch v0.15.0\necho \". $HOME/.asdf/asdf.sh\" \u003e\u003e ~/.bashrc\necho \". $HOME/.asdf/completions/asdf.bash\" \u003e\u003e ~/.bashrc\n. ~/.bashrc\nasdf plugin add erlang\nasdf plugin add nodejs\nasdf plugin add ruby\n```\n\nIf you have any issues please refer to the asdf documentation.\n\n## Development\n\n### Layout\n\nerlang.org uses a combination of [CSS Grid] layout and [Bootstrap 5\nGrid] layout. The goal is to use CSS Grid for all responsive layouts\nand then use Bootstrap Grid for all the non-responsive things.\n\nUsing CSS Grid to do the responsive layout instead of Bootstrap\nremoves a lot of extra divs and `order` classes that are needed\notherwise. However, it removes the layout from the html, so it\nsometimes becomes less obvious what is going on.\n\n[CSS Grid]: https://css-tricks.com/snippets/css/complete-guide-grid/\n[Bootstrap 5 Grid]: https://getbootstrap.com/docs/5.0/layout/grid/\n\nThe HTML for a normal page looks something like this:\n\n```html\n\u003cbody\u003e\n    \u003cheader class=\"container header\"\u003e\n        \u003cnav\u003e\u003c/nav\u003e\n    \u003c/header\u003e\n    \u003cdiv class=\"container body\"\u003e\n      \u003caside class=\"sidebar\"\u003e\u003c/aside\u003e\n      \u003cmain class=\"main\"\u003e\n          \u003cdiv class=\"top\"\u003e\u003c/div\u003e\n          \u003cdiv class=\"content\"\u003e\u003c/div\u003e\n      \u003c/main\u003e\n    \u003c/div\u003e\n    \u003cfooter class=\"container footer\"\u003e\u003c/footer\u003e\n\u003c/body\u003e\n```\n\nIn the above the `container` class is part of bootstrap and is used for\nstyling and then we use CSS grid to place the content of the `body` and\n`main` classes responsively:\n\n```scss\n@include media-breakpoint-up(lg) {\n    .body {\n        display: grid;\n        /* 2 columns on \u003e lg screens */\n        grid-template-columns: 1fr auto;\n    }\n    .main {\n        display: grid;\n    }\n}\n@include media-breakpoint-down(lg) {\n    .body {\n        display: grid;\n        /* Hide the sidebar on small screens */\n        .sidebar {\n            display: none;\n        }\n    }\n    .main {\n        display: grid;\n    }\n}\n```\n\n### Manipulating CSS\n\nBootstrap 5 comes with a lot of css entities built in. You should have a look around in the [bootstrap docs] to see what you can use.\n\nIf you want to change the color of a specific component there is a list of the sass variable that you need to change in the specific page. For example if you want to change the font-size in badges you can lookup the variable here: \u003chttps://getbootstrap.com/docs/5.0/components/badge/#sass\u003e. And then set `$badge-font-size: 0.80em` in [_variables.scss](_sass/_variables.scss]).\n\nA full list of all the variables can be found in `node_modules/bootstrap/scss/_variables.scss`.\n\nYou can of course also create your own styles, but we try to stay with the bootstrap styles as much as possible.\n\n[bootstrap docs]: https://getbootstrap.com/docs/5.1/\n\n## Architecture\n\n## Things to do when switching\n\n- [ ] Change www.erlang.org to point to new cdn.\n\n### Redirection fixes\n- [x] Redirect blog.erlang.org/* to www.erlang.org/blog\n- [x] Redirect bugs.erlang.org/browse/* to www.erlang.org/bugs/\n- [x] Redirect bugs.erlang.org/* to github.com/erlang/otp/issues\n- [ ] Redirect erlang.org/faq/* to www.erlang.org/faq\n- [ ] Redirect erlang.org/eep/* to www.erlang.org/eep\n- [ ] Redirect erlang.org/eeps/* to www.erlang.org/eeps\n- [ ] Redirect erlang.org/doc/* to www.erlang.org/doc\n- [ ] Redirect erlang.org/workshop/* to www.erlang.org/workshop\n- [x] Redirect www.erlang.org/download/* to erlang.org/download\n- [x] Redirect www.erlang.org/~* to erlang.org/~*\n- [x] Redirect www.erlang.org/course/* to erlang.org/course\n- [x] Redirect www.erlang.org/documentation/* to erlang.org/documentation\n- [x] Redirect www.erlang.org/mailman/* to erlang.org/mailman\n- [x] Redirect www.erlang.org/mailman-icons/* to erlang.org/mailman-icons\n- [x] Redirect www.erlang.org/pipermail/* to erlang.org/pipermail\n\n## Things that have been removed\n\n* The course (this is actually on erlang.org)\n* The events (redirect to EEF?)\n* Documentation version index page (redirect to erlang.org/documentation)\n\n## Ideas\n\n* Add plausable.io tracking\n* Add \u003chttps://search.google.com/search-console/\u003e support?\n* Add visual testing\n  * Use [BackstopJS](https://css-tricks.com/automating-css-regression-testing/) for regression testing \n  * \u003chttps://applitools.com/\u003e\n* Rework /community to not just be a bunch of links. Maybe the rust page can give some inspiration? \u003chttps://www.rust-lang.org/community\u003e\n* Add markdownlint? \u003chttps://www.npmjs.com/package/markdownlint\u003e\n* Add paginated docsearch results. See \u003chttps://discourse.algolia.com/t/dedicated-search-page/583\u003e and \u003chttps://jsfiddle.net/maxiloc/oemnhuv4/\u003e\n* `/docs`\n  * Other sections? Learning/Developing/References\n* `/community`\n  * Beam Languages\n  * Other projects\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ferlang%2Ferlang-org","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ferlang%2Ferlang-org","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ferlang%2Ferlang-org/lists"}