Home
Softono
b

b310-digital

Professional software vendor delivering innovative solutions on the Softono platform. Specialized in both open-source and proprietary software development.

Total Products
2

Software by b310-digital

Mindwendel
Open Source

Mindwendel

# mindwendel ![Workflow Status Badge](https://github.com/b310-digital/mindwendel/actions/workflows/on_push_branch__execute_ci_cd.yml/badge.svg) Create a challenge. Ready? Brainstorm. mindwendel helps you to easily brainstorm and upvote ideas and thoughts within your team. Built from scratch with [Phoenix](https://www.phoenixframework.org). - [mindwendel](#mindwendel) - [Features](#features) - [Use-cases](#use-cases) - [Getting Started](#getting-started) - [Contributing](#contributing) - [Workflow](#workflow) - [Development](#development) - [Testing](#testing) - [Production](#production) - [Note](#note) - [Build release and production docker image](#build-release-and-production-docker-image) - [Formatting](#formatting) - [Environment Variables](#environment-variables) - [Localization](#localization) - [Testimonials](#testimonials) - [Acknowledgements](#acknowledgements) ## Features - 5 minute setup (It is not a joke) - Anonymously invite people to your brainstormings - no registration needed. Usernames are optional! - Easily create and upvote ideas, with live updates from your mindwendel members - Cluster or filter your ideas with custom labels - Preview of links to ease URL sharing - Add automatically encrypted file attachments which are uploaded to an S3 compatible storage backend - Add lanes, use drag & drop to order ideas - Add comments to ideas - AI-powered idea generation using OpenAI-compatible LLM APIs - Export your generated ideas to html or csv (currently comma separated) - German & English Translation files - By default, brainstormings are deleted after 30 days to ensure GDPR compliancy ![](docs/screenshot.png) ![](docs/screenshot2.png) ## Use-cases Brainstorm ... - ... new business ideas - ... solutions for a problem - ... what to eat tonight - ... ## Getting Started mindwendel can be run just about anywhere. So checkout our [Installation Guides](./docs/installing_mindwendel.md) for detailed instructions for various deployments. The easiest way to deploy and run mindwendel is using our own `docker-compose-prod.yml` file. For instructions, see [Setup for Production](#setup-for-production). If you want to contribute, jump ahead to [Development](#development)! ## Contributing To get started with a development installation of mindwendel, follow the instructions below. mindwendel is built on top of: - [Elixir](https://elixir-lang.org/install.html) - [Phoenix Framework](https://hexdocs.pm/phoenix/installation.html#phoenix) - [Phoenix LiveView](https://github.com/phoenixframework/phoenix_live_view) - [PostgreSQL](https://www.postgresql.org) ### Workflow 1. Fork it (<https://github.com/mindwendel/mindwendel/fork>) 2. Create your feature branch (`git checkout -b fooBar`) 3. Commit your changes (`git commit -am 'Add some fooBar'`) 4. Push to the branch (`git push origin fooBar`) 5. Create a new Pull Request ### Development - Startup docker compose setup ```bash docker compose up --build -d ``` - Setup the database ```bash docker compose exec app mix ecto.setup ``` - Start the server ```bash docker compose exec app mix phx.server ``` - Go to http://localhost:4000/ - Open you favorite editor and start developing - Open a shell in the docker container to execute tests, etc. ```bash docker compose exec app bash ``` - Go to http://localhost:4000/ #### Localization You can extract new strings to translate by running: ```bash mix gettext.extract --merge ``` ### Testing - Startup docker compose setup ```bash docker compose up --build -d ``` - Run the test ```bash docker compose exec app mix test ``` ### Setup for Production - Generate self-signed ssl sertificate for the postgres server on the host machine; the generated files are mounted into the docker container ```bash mkdir -p ./ca openssl req -new -text -passout pass:abcd -subj /CN=localhost -out ./ca/server.req -keyout ./ca/privkey.pem openssl rsa -in ./ca/privkey.pem -passin pass:abcd -out ./ca/server.key openssl req -x509 -in ./ca/server.req -text -key ./ca/server.key -out ./ca/server.crt chmod 600 ./ca/server.key test $(uname -s) = Linux && chown 70 ./ca/server.key ``` - Duplicate and rename `.env.prod.default` ```bash cp .env.prod.default .env.prod ``` - Adjust all configs in `.env.prod`, e.g. database settings, ports, disable ssl env vars if necessary - Start everything at once (including a forced build): ```bash docker compose --file docker-compose-prod.yml --env-file .env.prod up -d --build --force-recreate ``` - Open the browser and go to `http://${URL_HOST}` #### Note - The url has to match the env var `URL_HOST`; so http://localhost will not work when your `URL_HOST=0.0.0.0` - The mindwendel production configuration is setup to enforce ssl, see Mindwendel.Endpoint configuration in `config/prod.exs` - The mindwendel production configuration supports deployment behind a reverse porxy (load balancer) by parsing the proper protocol from the x-forwarded-\* header of incoming requests, see `config/prod.exs` - If you are having troubles during setup, please raise an issue. ### Build release and production docker image - Build the docker image based on our Dockerfile ```bash docker build -t mindwendel_prod . ``` ### Formatting We are using Elixir's built-in formatter. - Check if the code is properly formatted ```bash mix format --check-formatted ``` - Automatically format the code ```bash mix format ``` ## Feature flags ### Privacy and automatic data removal Mindwendel includes a job runner that deletes old brainstormings after a defined number of days. This can be controlled with the setting `MW_FEATURE_BRAINSTORMING_REMOVAL_AFTER_DAYS`, which can be set to for instance to `30`. ### File Storage File storage is available through an s3 compatible object storage backend. An encryption key (`VAULT_ENCRYPTION_KEY_BASE64`) needs to be generated before, e.g.: ``` iex 32 |> :crypto.strong_rand_bytes() |> Base.encode64() ``` or ``` openssl rand -base64 32 ``` Then, object storage and the vault key need to be set: ``` OBJECT_STORAGE_BUCKET: mindwendel OBJECT_STORAGE_SCHEME: "http://" OBJECT_STORAGE_HOST: minio OBJECT_STORAGE_PORT: 9000 OBJECT_STORAGE_REGION: local OBJECT_STORAGE_USER: ... OBJECT_STORAGE_PASSWORD: ... VAULT_ENCRYPTION_KEY_BASE64: ... ``` There is an example given inside the `docker-compose.yml` with a docker compose minio setup. To deactivate file storage, use `MW_FEATURE_IDEA_FILE_UPLOAD` (defaults to `true`) and set it to `false`. ### AI Integration Mindwendel supports AI-powered idea generation using OpenAI and OpenAI-compatible APIs. To enable AI features: **For OpenAI (default):** ``` MW_AI_ENABLED=true MW_AI_API_KEY=your-openai-api-key MW_AI_API_MODEL=gpt-4o-mini # Optional, defaults to gpt-4o-mini ``` **For OpenAI-compatible endpoints (e.g., local LLMs, Mistral, etc.):** ``` MW_AI_ENABLED=true MW_AI_API_KEY=your-api-key MW_AI_API_MODEL=mistral-large-latest # Or your model name MW_AI_API_BASE_URL=https://api.mistral.ai/v1 # Required for non-OpenAI endpoints ``` **Optional token limits to control usage:** ``` MW_AI_TOKEN_LIMIT_DAILY=1000000 # Daily token limit (default: 1M) MW_AI_TOKEN_LIMIT_HOURLY=100000 # Hourly token limit (default: 100K) MW_AI_TOKEN_RESET_HOUR=0 # Hour of day to reset daily limit (default: 0/midnight UTC) MW_AI_REQUEST_TIMEOUT=60000 # Request timeout in milliseconds (default: 60000) ``` AI features are disabled by default. When enabled, users can generate ideas using AI based on their brainstorming context. ### Localization Currently, there are three language files available, german (`de`), english (`en`) and italian (`it`). To set the default_locale, you can set `MW_DEFAULT_LOCALE`. The default is english. ## Testimonials <img src="https://www.nibis.de/img/nlq-medienbildung.png" align="left" style="margin-right:20px"> <img src="https://kits.blog/wp-content/uploads/2021/03/kits_logo.svg" width=100px align="left" style="margin-right:20px"> kits is a project platform hosted by a public institution for quality development in schools (Lower Saxony, Germany) and focusses on digital tools and media in language teaching. mindwendel is used in workshops to activate prior knowledge, and collect and structure ideas. In addition, mindwendel can be found on https://kits.blog/tools and can be used by schools for free. More info on how to use it can be found in this post https://kits.blog/digitale-lesestrategien-brainstorming/ Logos and text provided with courtesy of kits. ## Acknowledgements - https://github.com/JannikStreek - https://github.com/gerardo-navarro - https://github.com/nwittstruck - Lightbulb stock image by LED Supermarket at Pexels: https://www.pexels.com/de-de/foto/die-gluhbirne-577514/ ## Image Licenses - Lightbulb, Pexels / CC0: https://www.pexels.com/license/, https://www.pexels.com/terms-of-service/ - GitHub Logo: https://github.com/logos

Project Management Team Whiteboard
134 Github Stars
TeamMapper
Open Source

TeamMapper

# TeamMapper ![TeamMapper Screenshot](docs/teammapper-logo.png "TeamMapper Logo") Mindmapping made simple: Host and create your own mindmaps. Share your mindmap sessions with your team and collaborate on mindmaps. TeamMapper is based on mindmapp (https://github.com/cedoor/mindmapp , discontinued). In contrast to mindmapp, TeamMapper features shared mindmapping sessions for your team based on websockets. Try it: [TeamMapper.org](https://teammapper.org) ![TeamMapper Screenshot](docs/teammapper-screenshot.png?raw=true "TeamMapper Screenshot with two users") ## Features: - **Creation**: Host and create your own mindmaps - **Customization**: Add images, pictograms\*, colors, font properties and links to nodes - **Collaboration**: Share your mindmap with friends and collegues, using either a view-only or modification invite! - **Interoperability**: Import and export functionality (JSON, Mermaid, SVG, PDF, PNG...) - **Shareability**: Use a QR Code or URL to share your maps - **GDPR Compliancy**: By default, mindmaps are deleted after 30 days - **Usability**: Redo / Undo, many Shortcuts ## Getting started ### Quick Start (without building the image) Prepared docker image: `docker pull ghcr.io/b310-digital/teammapper:latest` #### Docker compose Attention: Add the missing password for postgres inside app_prod and postgres_prod! `docker compose up -d` and visit `localhost:80` ```docker version: "3.8" services: app_prod: image: ghcr.io/b310-digital/teammapper:latest environment: MODE: PROD BINDING: "0.0.0.0" POSTGRES_DATABASE: teammapper-db POSTGRES_HOST: postgres_prod POSTGRES_PASSWORD: POSTGRES_PORT: 5432 POSTGRES_SSL: false POSTGRES_SSL_REJECT_UNAUTHORIZED: false POSTGRES_USER: teammapper-user POSTGRES_QUERY_TIMEOUT: 100000 POSTGRES_STATEMENT_TIMEOUT: 100000 DELETE_AFTER_DAYS: 30 AI_ENABLED: false ports: - 80:3000 depends_on: - postgres_prod postgres_prod: image: postgres:12-alpine # Pass config parameters to the postgres server. # Find more information below when you need to generate the ssl-relevant file your self # command: -c ssl=on -c ssl_cert_file=/var/lib/postgresql/server.crt -c ssl_key_file=/var/lib/postgresql/server.key environment: PGDATA: /var/lib/postgresql/data/pgdata POSTGRES_DB: teammapper-db POSTGRES_PASSWORD: POSTGRES_PORT: 5432 POSTGRES_USER: teammapper-user volumes: # To setup an ssl-enabled postgres server locally, you need to generate a self-signed ssl certificate. # See README.md for more information. # Mount the ssl_cert_file and ssl_key_file into the docker container. - ./ca/server.crt:/var/lib/postgresql/server.crt - ./ca/server.key:/var/lib/postgresql/server.key - postgres_prod_data:/var/lib/postgresql/data/pgdata volumes: postgres_prod_data: ``` For examples with a reverse proxy, see [documentation about deployment](docs/deployment.md). ### Development - Start up app necessary services ```bash docker compose up -d --build --force-recreate ``` - Install and build local workspace packages required by the frontend ```bash docker compose exec app pnpm --filter teammapper-frontend run build:packages ``` - Start frontend and backend at once ```bash docker compose exec app pnpm run dev ``` or start frontend and backend separately ```bash # Open two terminal sessions on your host machine # In first terminal session docker compose exec app pnpm --filter teammapper-backend start # In second terminal session docker compose exec app pnpm --filter teammapper-frontend start ``` - Visit the frontend in http://localhost:4200 ### Test - Create a test database ```bash docker compose exec postgres createdb -e -U teammapper-user -W teammapper-backend-test ``` - Execute the tests ```bash docker compose exec app pnpm --filter teammapper-backend run test:e2e ``` ### Production - Duplicate and rename `.env.default` ```bash cp .env.default .env.prod ``` - Adjust all configs in `.env.prod`, e.g. database settings, ports, enable ssl env vars if necessary - Start everything at once (including a forced build): ```bash docker compose --file docker-compose-prod.yml --env-file .env.prod up -d --build --force-recreate ``` - Go to `http://localhost:3011` (if default port is used in .env.prod) to open up teammapper. Happy mapping! - Optional commands: If you want to make sure to include the most recent updates, run first: ```bash docker compose --file docker-compose-prod.yml --env-file .env.prod build --no-cache ``` then: ```bash docker compose --file docker-compose-prod.yml --env-file .env.prod up -d --force-recreate ``` If you want to remove old data, including cached node packages and stored databases (DANGER!): ```bash docker compose --file docker-compose-prod.yml --env-file .env.prod down -v ``` If you want to run prod migrations (again): ```bash docker compose exec app_prod pnpm --filter teammapper-backend run prod:typeorm:migrate ``` #### Postgres and SSL If needed, you can make the connection to Postgres more secure by using a SSL connection. - Generate self-signed ssl sertificate for the postgres server on the host machine; the generated files are mounted into the docker container ```bash mkdir -p ./ca openssl req -new -text -passout pass:abcd -subj /CN=localhost -out ./ca/server.req -keyout ./ca/privkey.pem openssl rsa -in ./ca/privkey.pem -passin pass:abcd -out ./ca/server.key openssl req -x509 -in ./ca/server.req -text -key ./ca/server.key -out ./ca/server.crt chmod 600 ./ca/server.key test $(uname -s) = Linux && chown 70 ./ca/server.key ``` And uncomment the line: ```bash # command: -c ssl=on -c ssl_cert_file=/var/lib/postgresql/server.crt -c ssl_key_file=/var/lib/postgresql/server.key ``` within the docker-compose-prod file. #### Running jobs Trigger delete job (also executed daily with cron task scheduler): ``` docker compose --file docker-compose-prod.yml --env-file .env.prod exec app_prod pnpm --filter teammapper-backend run prod:data:maps:cleanup ``` #### Running further queries Example of running sql via typeorm: ``` docker compose --file docker-compose-prod.yml --env-file .env.prod exec app_prod pnpm --filter teammapper-backend exec typeorm query "select * from mmp_node" --dataSource ./dist/data-source.js ``` ### Default Settings The following files contain configurations for default settings: 1. `/teammapper-backend/config/settings.dev.json` - Contains the default values for development mode 2. `/teammapper-backend/config/settings.prod.json` - Contains the default values for production mode - Changes here require rebuilding the Docker image 3. `/config/settings.override.json` - Values defined in `settings.override.json` override the values in `settings.prod.json` - Values can be adjusted at runtime The settings are conceptually divided into: - **System Settings**: Settings provided by the application, which are not cached by the frontend and can only be adjusted in the backend - **User Settings**: values configured by the user in the frontend, which persist separately and override system defaults where applicable. The settings configuration includes the following feature flags: - `pictograms`: Disables/Enables the pictogram feature (default: disabled). Note: You have to set this flag before build time in the JSON config! - `ai`: Disables/Enables AI functionality like generating mindmaps with AI. Can be controlled via the `AI_ENABLED` environment variable (default: `false`). #### Environment variable overrides The following environment variables override the feature flags from the JSON config: | Variable | Description | Default | | --- | --- | --- | | `AI_ENABLED` | Enable AI features (mindmap generation) | `false` | | `DELETE_AFTER_DAYS` | Number of days before mindmaps are deleted | `30` | | `LOG_LEVEL` | NestJS log verbosity (`error`, `warn`, `log`, `debug`, `verbose`) | `debug` in DEV, `log` otherwise | ### Further details - Once this docker volume is initialized after the first `docker compose up`, the database-related variables in `.env.prod` will not have any effect; please have this in mind => you will then need to setup your database manually ## Contributing 1. Fork it 2. Create your feature branch (`git checkout -b fooBar`) 3. Commit your changes (`git commit -am 'Add some fooBar'`) 4. Push to the branch (`git push origin fooBar`) 5. Create a new Pull Request ## Testimonials <img src="https://www.nibis.de/img/nlq-medienbildung.png" align="left" style="margin-right:20px"> <img src="https://kits.blog/wp-content/uploads/2021/03/kits_logo.svg" width=100px align="left" style="margin-right:20px"> kits is a project platform hosted by a public institution for quality development in schools (Lower Saxony, Germany) and focusses on digital tools and media in language teaching. TeamMapper is used in workshops to activate prior knowledge, and collect and structure ideas. In addition, TeamMapper can be found on https://kits.blog/tools and can be used by schools for free. Logos and text provided with courtesy of kits. ## Acknowledgements - \*Pictograms author: Sergio Palao. Origin: ARASAAC (http://www.arasaac.org). License: CC (BY-NC-SA). Owner: Government of Aragon (Spain) - Mindmapp: https://github.com/cedoor/mindmapp (discontinued) - mmp: https://github.com/cedoor/mmp (discontinued) - D3: https://github.com/d3/d3 - DomPurify: https://github.com/cure53/DOMPurify ``` ```

Mind Mapping
464 Github Stars