{"id":45631526,"url":"https://github.com/jbl2024/latelier","last_synced_at":"2026-02-24T00:06:35.333Z","repository":{"id":35844209,"uuid":"169524031","full_name":"jbl2024/latelier","owner":"jbl2024","description":"L'atelier, a project management tool","archived":false,"fork":false,"pushed_at":"2025-10-15T03:14:09.000Z","size":36505,"stargazers_count":92,"open_issues_count":7,"forks_count":24,"subscribers_count":4,"default_branch":"master","last_synced_at":"2026-02-17T04:36:37.866Z","etag":null,"topics":["bpmn","kanban","meetings","meteor","nodejs","project-management","spa","vue"],"latest_commit_sha":null,"homepage":"https://jbl2024.github.io/latelier-page/","language":"Vue","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/jbl2024.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","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":"ROADMAP.md","authors":null}},"created_at":"2019-02-07T05:30:53.000Z","updated_at":"2026-01-06T02:45:48.000Z","dependencies_parsed_at":"2024-01-06T23:55:38.108Z","dependency_job_id":null,"html_url":"https://github.com/jbl2024/latelier","commit_stats":null,"previous_names":[],"tags_count":69,"template":false,"template_full_name":null,"purl":"pkg:github/jbl2024/latelier","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jbl2024%2Flatelier","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jbl2024%2Flatelier/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jbl2024%2Flatelier/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jbl2024%2Flatelier/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/jbl2024","download_url":"https://codeload.github.com/jbl2024/latelier/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jbl2024%2Flatelier/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29762010,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-23T21:02:23.375Z","status":"ssl_error","status_checked_at":"2026-02-23T20:58:31.539Z","response_time":90,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: 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":["bpmn","kanban","meetings","meteor","nodejs","project-management","spa","vue"],"created_at":"2026-02-24T00:06:32.535Z","updated_at":"2026-02-24T00:06:35.326Z","avatar_url":"https://github.com/jbl2024.png","language":"Vue","funding_links":[],"categories":[],"sub_categories":[],"readme":"# latelier\n\n[![FOSSA Status](https://app.fossa.com/api/projects/git%2Bgithub.com%2Fjbl2024%2Flatelier.svg?type=shield)](https://app.fossa.com/projects/git%2Bgithub.com%2Fjbl2024%2Flatelier?ref=badge_shield) [![Build Status](https://cloud.drone.io/api/badges/jbl2024/latelier/status.svg?ref=refs/heads/master)](https://cloud.drone.io/jbl2024/latelier) [![Codacy Badge](https://api.codacy.com/project/badge/Grade/404a011df8c04d219242ef80d1c26397)](https://www.codacy.com/manual/jbl2024/latelier?utm_source=github.com\u0026utm_medium=referral\u0026utm_content=jbl2024/latelier\u0026utm_campaign=Badge_Grade)\n\nA project management tool.\n\n![Kanban](/docs/kanban.png)\n\n## Features\n\n- [Kanban](\u003chttps://en.wikipedia.org/wiki/Kanban_(development)\u003e) task board with realtime updates\n- Timeline view of tasks and projects\n- [BPMN](https://en.wikipedia.org/wiki/Business_Process_Model_and_Notation) diagrams\n- [Business model canvas](https://en.wikipedia.org/wiki/Business_Model_Canvas) sheet for project\n- Projects grouped by organization\n- Project weather like status\n- Meeting reports\n- Permissions per organization \u0026 per project\n\n\n## Demonstration\n\nDemo server: https://latelier-demo.services2.jbl2024.com\n\nWarning: do not store sensitive data, use at your own risk. \nData is reset periodically.\n\nAvailable credentials:\n\n- username: user1@localhost / password: user1\n\n## Installation\n\n### Docker\n\nSince v2.9.0, Docker images are available on docker hub: https://hub.docker.com/r/jbl2024/latelier .\n\nA [docker-compose.yml](/docker-compose.yml) is also provided.\n\n### Meteor\n\nThis application is built with [Meteor](https://www.meteor.com/) framework.\n\nSee https://www.meteor.com/install for installation instructions.\n\n### Requirements\n\nThe following external dependencies are required:\n\n| Component         | Usage                 | Reference       |\n| ----------------- | --------------------- | --------------- |\n| GraphicsMagick    | Generate thumbnails   | http://www.graphicsmagick.org/ |\n| Pandoc            | Export content to libreoffice \u0026 word formats | https://pandoc.org/ |\n\n\n### Configuration\n\nCopy `settings-development.json.sample.json` to `settings-development.json` and update values matching your configuration\n\nSettings:\n\n| Key                            | Type     | Default value   | Description                                      |\n| ------------------------------ | -------- | --------------- | ------------------------------------------------ |\n| generateFixtures               | boolean  | false           | If true, users fixtures are generated at startup |\n| disableAccountCreation         | boolean  | false           | If true account creation is forbidden            |\n| attachmentsPath                | string   | /tmp/           | Attachment storage path on fs                    |\n| avatarsPath                    | string   | attachmentsPath | Avatar storage path on fs                        |\n| email                          | object   |                 | Email settings                                   |\n| roles.admin                    | [string] | []              | Users matching emails will have the admin role   |\n| public.seo.titlePrefix         | string   | l'atelier       | window.title prefix                              |\n| public.sso                     | object   | {}              | See below                                        |\n| public.emailVerificationNeeded | boolean  | false           | If false, no verification email is sent          |\n| public.disableAttachments      | boolean  | false           | If true, attachments are disabled                |\n| public.tracking                | object   | {}              | See below                                        |\n| public.tracking.matomo         | object   | {}              | See https://github.com/AmazingDreams/vue-matomo#usage                    |\n| public.tracking.matomo.enabled | boolean  | false           | If true, page and search keyword tracking are enabled|\n| uploadTransport                | string   | ddp             | http or ddp                                      |\n| notificationsPerUser           | number   | 50              | max number of notifications stored per user      |\n| users                          | object   | {}              | See below                                        |\n| digestsRetention               | number   | 60              | Number of days to keep in digest                 |\n| storage                        | object   | {}              | Storage. If empty, fs is used                    |\n| auth                           | object   | {}              | See below                                        |\n| coedition                      | object   | {}              | See below                                        |\n\nemail:\n\n| Key    | Type   | Default value     | Description                  |\n| ------ | ------ | ----------------- | ---------------------------- |\n| from   | string | noreply@localhost | From email when sending mail |\n| prefix | string |                   | Subject prefix               |\n\nusers:\n\n| Key    | Type                    | Default value | Description                   |\n| ------ | ----------------------- | ------------- | ----------------------------- |\n| search | string (\"admin\", \"all\") | all           | Who can search existing users |\n| invite | string (\"admin\", \"all\") | all           | Who can invite people         |\n\nsso:\n\n| Key     | Type    | Default value | Description                |\n| ------- | ------- | ------------- | -------------------------- |\n| enabled | boolean | false         | If true, sso is enabled    |\n| email   | string  | null          | email header to match user |\n| logoutUrl | string | null         | Logout url                 |\n\nstorage:\n\n| Key           | Type          | Default value | Description                                                                                            |\n| ------------- | ------------- | ------------- | ------------------------------------------------------------------------------------------------------ |\n| type          | string (\"s3\") |               | Storage type                                                                                           |\n| migrateFromFS | boolean       | false         | If true, files are moved from FS to storage system at startup (make sure you backup your data before!) |\n| s3            | object        | {}            | s3 options                                                                                             |\n\ns3\n\n| Key      | Type   | Default value | Description            |\n| -------- | ------ | ------------- | ---------------------- |\n| endpoint | string |               | Storage url (optional) |\n| key      | string |               | key                    |\n| secret   | string |               | secret                 |\n| region   | string |               | region                 |\n| bucket   | string |               | bucket                 |\n\nauth:\n\n| Key    | Type   | Default value | Description |\n| ------ | ------ | ------------- | ----------- |\n| oauth2 | object | {}            | See below   |\n\noauth2:\n\n| Key                     | Type    | Default value | Description                                               |\n| ----------------------- | ------- | ------------- | --------------------------------------------------------- |\n| enabled                 | boolean | false         | If true, oauth2 is enabled                                |\n| title                   | string  | OAuth2        | Button title                                              |\n| idMap                   | string  |               | id map                                                    |\n| usernameMap             | string  |               | preferred_username                                        |\n| fullnameMap             | string  |               | given_name                                                |\n| emailMap                | string  |               | email                                                     |\n| clientId                | string  |               | \u003cKeycloak create Client ID\u003e                               |\n| secret                  | string  |               | \u003cKeycloak Client secret\u003e\"                                 |\n| serverUrl               | string  |               | \u003cKeycloak server name\u003e/auth                               |\n| authEndpoint            | string  |               | /realms/\u003ckeycloak realm\u003e/protocol/openid-connect/auth     |\n| userInfoEndpoint        | string  |               | /realms/\u003ckeycloak realm\u003e/protocol/openid-connect/userinfo |\n| tokenEndpoint           | string  |               | /realms/\u003ckeycloak realm\u003e/protocol/openid-connect/token    |\n| logoutUrl               | string  |               | /realms/l\u003ckeycloak realm\u003e/protocol/openid-connect/logout  |\n| logoutRedirectParameter | string  |               | redirect_uri                                              |\n| idTokenWhitelistFields  | string  |               | []                                                        |\n\nNote: tested only with [keycloak](https://www.keycloak.org/).\n\ncoedition:\n\n| Key                     | Type     | Default value   | Description                                            |\n| ----------------------- | ------- | ---------------- | ------------------------------------------------------ |\n| steps                   | integer  | 500             | Number of steps to keep for coedit collab feature      |\n| daysToKeep              | integer  | 3               | previous edition steps are removed after daysToKeep    |\n\n\nExample:\n\n```\n{\n  \"generateFixtures\": false,\n  \"disableAccountCreation\": false,\n  \"attachmentsPath\": \"/tmp/attachments/\",\n  \"notificationsPerUser\": 50,\n  \"users\": {\n    \"search\": \"admin\",\n    \"invite\": \"admin\"\n  },\n  \"email\": {\n    \"from\": \"noreply@localhost\"\n  },\n  \"roles\": {\n    \"admin\": [\"foo@bar.com\"]\n  },\n  \"public\": {\n    \"emailVerificationNeeded\": false,\n    \"seo\": {\n      \"titlePrefix\": \"l'atelier\"\n    },\n    \"sso\": {\n      \"enabled\": true,\n      \"email\": \"header-email\"\n    },\n    \"uploadTransport\": \"ddp\"\n  }\n}\n```\n\n### Fixtures (dev only feature)\n\nIf `generateFixtures` parameter is set to true, 50 users are created at startup (if user count is \u003c= 2).\nDefault password for generated users is `password`.\n\n### Install dependencies\n\n`meteor npm install`\n\n### Start\n\n`npm start`\n\n### Docker development environment\n\nA Dockerfile and a docker-compose are provided to start a development environment.\n\n```\n$ docker-compose --file docker-compose.dev.yml up\n```\n\nwill start in dev mode (autorestart, no production build):\n\n- the app container with node \u0026 meteor\n- mongodb (latest)\n- mongoexpress (http://localhost:8081)\n- maildev (http://localhost:1080)\n\nWhen all containers are running, open another terminal to start meteor application:\n\n```\n$ docker-compose --file docker-compose.dev.yml exec app npm run start-dev\n```\n\nAfter a few minutes, the app will be available at http://localhost\n\nNote: do not forget to create a `settings-development.json` file.\n\n### Screenshots\n\n![Dashboard](/docs/task.png)\n\n![Dashboard](/docs/dashboard.png)\n\n![Planning (organization)](/docs/planning1.png)\n\n![Planning (project)](/docs/planning2.png)\n\n![BPMN](/docs/bpmn.png)\n\n![Weather](/docs/weather.png)\n\n![Canvas](/docs/canvas.png)\n\n![Meetings calendar](/docs/meeting1.png)\n\n![Meeting detail](/docs/meeting2.png)\n\n### License\n\nApache License 2.0\n\n[![FOSSA Status](https://app.fossa.io/api/projects/git%2Bgithub.com%2Fjbl2024%2Flatelier.svg?type=large)](https://app.fossa.io/projects/git%2Bgithub.com%2Fjbl2024%2Flatelier?ref=badge_large)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjbl2024%2Flatelier","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fjbl2024%2Flatelier","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjbl2024%2Flatelier/lists"}