diff --git a/mindwtr/.helmignore b/mindwtr/.helmignore new file mode 100644 index 000000000..37bd42d84 --- /dev/null +++ b/mindwtr/.helmignore @@ -0,0 +1,6 @@ +# Patterns to ignore when building packages. +# This supports shell glob matching, relative path matching, and +# negation (prefixed with !). Only one pattern per line. +.git +~* +.DS_Store diff --git a/mindwtr/Chart.yaml b/mindwtr/Chart.yaml new file mode 100644 index 000000000..4dbb58885 --- /dev/null +++ b/mindwtr/Chart.yaml @@ -0,0 +1,6 @@ +apiVersion: v2 +name: mindwtr +description: Mindwtr is a free, offline-first task management app built on Getting Things Done (GTD) methodology. +type: application +version: 1.0.0 +appVersion: "1.3.3" diff --git a/mindwtr/OlaresManifest.yaml b/mindwtr/OlaresManifest.yaml new file mode 100644 index 000000000..57c910ee8 --- /dev/null +++ b/mindwtr/OlaresManifest.yaml @@ -0,0 +1,64 @@ +olaresManifest.version: '0.12.0' +olaresManifest.type: app +apiVersion: 'v3' + +workloadReplicas: + mindwtr: 1 +metadata: + name: mindwtr + description: A free, offline-first task management app built on Getting Things Done (GTD) methodology. + icon: https://raw.githubusercontent.com/dongdongbh/Mindwtr/main/apps/desktop/src-tauri/icons/128x128@2x.png + appid: mindwtr + version: '1.0.0' + title: Mindwtr + categories: + - Productivity_v112 + - workspace +permission: + appData: true + appCache: true +spec: + versionName: '1.3.3' + fullDescription: | + Mindwtr is a free, privacy-first task management app built on the Getting Things Done (GTD) methodology. + + **Key Features:** + - **GTD Workflow**: Inbox, Next Actions, Projects, Waiting, Someday/Maybe, and Archive. + - **Fast Capture & Processing**: Quickly dump ideas and tasks with context tags, priorities, reminders, and due dates. + - **Multi-Platform Sync**: Works on Web, Windows, macOS, Linux, iOS, and Android with self-hosted Mindwtr Cloud. + - **Privacy & Ownership**: All data stays on your device and your personal Olares cloud, with multi-token isolated namespaces. + - **Task Automation REST API**: Built-in REST API for scripting and workflow integrations. + upgradeDescription: | + Initial release of Mindwtr on Olares: + - Bundles Mindwtr Web (PWA) and Mindwtr Cloud (sync server + REST API). + - Unified single-domain reverse proxy for seamless same-origin sync. + - Zero-CORS setup with auto-detected sync server. + - Supports multi-device sync across Windows, macOS, Linux, iOS, and Android. + developer: dongdongbh + website: https://mindwtr.app + sourceCode: https://github.com/dongdongbh/Mindwtr + submitter: Inverstar + locale: + - en-US + - zh-CN + requiredMemory: 256Mi + limitedMemory: 1024Mi + requiredDisk: 256Mi + limitedDisk: 10Gi + requiredCpu: 0.1 + limitedCpu: 2 + supportArch: + - amd64 + - arm64 +options: + dependencies: + - name: olares + type: system + version: '>=1.12.6-0' +entrances: +- name: mindwtr + port: 5173 + host: mindwtr-service + title: Mindwtr + icon: https://raw.githubusercontent.com/dongdongbh/Mindwtr/main/apps/desktop/src-tauri/icons/128x128@2x.png + openMethod: window diff --git a/mindwtr/i18n/en-US/OlaresManifest.yaml b/mindwtr/i18n/en-US/OlaresManifest.yaml new file mode 100644 index 000000000..ed91be1fb --- /dev/null +++ b/mindwtr/i18n/en-US/OlaresManifest.yaml @@ -0,0 +1,21 @@ +metadata: + title: Mindwtr + description: A free, offline-first task management app built on Getting Things Done (GTD) methodology. +spec: + fullDescription: | + **Get things out of your head.** + + Mindwtr is a free, privacy-first task management application based on the Getting Things Done (GTD) methodology. + + **Key Features:** + - **Full GTD Workflow**: Inbox, Next Actions, Projects, Waiting, Someday/Maybe, and Archive. + - **Fast Capture & Processing**: Quickly dump ideas and tasks with context tags, priorities, reminders, and due dates. + - **Multi-Platform Sync**: Works on Web, Windows, macOS, Linux, iOS, and Android with self-hosted Mindwtr Cloud. + - **Privacy & Ownership**: All data stays on your device and your personal Olares cloud, with multi-token isolated namespaces. + - **Task Automation REST API**: Built-in REST API for scripting and workflow integrations. + upgradeDescription: | + Initial release of Mindwtr on Olares: + - Integrated Mindwtr Web (PWA) and Mindwtr Cloud (sync server + REST API). + - Unified reverse proxy for seamless same-origin sync without CORS issues. + - Auto-detects cloud URL on first launch for effortless sync setup. + - Supports native mobile and desktop clients syncing directly to your Olares domain. diff --git a/mindwtr/i18n/zh-CN/OlaresManifest.yaml b/mindwtr/i18n/zh-CN/OlaresManifest.yaml new file mode 100644 index 000000000..bca7f333c --- /dev/null +++ b/mindwtr/i18n/zh-CN/OlaresManifest.yaml @@ -0,0 +1,21 @@ +metadata: + title: Mindwtr + description: 基于「搞定」(GTD)方法论的免费离线待办任务管理应用,支持跨平台多端同步。 +spec: + fullDescription: | + **把脑子里的事都倒出来。** + + Mindwtr 是一款基于「搞定」(Getting Things Done,GTD)方法的免费待办和任务管理应用。可离线使用,无需账号,注重隐私。 + + **主要功能:** + - **GTD 流程全覆盖**:收集箱(Inbox)、下一步行动(Next)、项目(Projects)、等待(Waiting)、将来/也许(Someday)及归档。 + - **极速收集与处理**:快速记录灵感与任务,支持上下文标签、优先级、提醒和截止日期。 + - **多端同步与跨平台**:支持 Web、Windows、macOS、Linux、iOS 及 Android 端,通过私有部署的 Mindwtr Cloud 同步数据。 + - **数据安全与隐私**:所有数据均保存在本地和您的 Olares 私有云中,支持多 Token 用户数据隔离。 + - **REST API 自动化**:内置 REST API,方便与其他自动化工具集成。 + upgradeDescription: | + Olares 首发版本: + - 集成 Mindwtr Web(PWA 网页版)与 Mindwtr Cloud(同步与 REST API 服务端)。 + - 采用一体化反向代理架构,Web 与 API 同源,实现零 CORS 跨域配置开箱即用。 + - 自动识别云同步地址,仅需设置 Token 即可无缝同步。 + - 支持桌面与移动端客户端(iOS / Android / Win / Mac)直接连接 Olares 域名进行同步。 diff --git a/mindwtr/owners b/mindwtr/owners new file mode 100644 index 000000000..0a68e6c15 --- /dev/null +++ b/mindwtr/owners @@ -0,0 +1,8 @@ +owners: +- 'Inverstar' +- 'LittleLollipop' +- 'TShentu' +- 'hysyeah' +- 'pengpeng' +- 'harveyff' +- 'zdf-org' diff --git a/mindwtr/templates/mindwtr.yaml b/mindwtr/templates/mindwtr.yaml new file mode 100644 index 000000000..d164cefbe --- /dev/null +++ b/mindwtr/templates/mindwtr.yaml @@ -0,0 +1,162 @@ +apiVersion: v1 +kind: ConfigMap +metadata: + name: mindwtr-nginx-conf + namespace: {{ .Release.Namespace }} +data: + default.conf: | + server { + listen 5173; + server_name _; + + root /usr/share/nginx/html; + index index.html; + add_header Content-Security-Policy "default-src 'self'; script-src 'self'; style-src 'self' 'unsafe-inline'; img-src 'self' data: blob: file:; media-src 'self' data: blob: file:; font-src 'self' data:; connect-src 'self' https: http://localhost:* ws://localhost:*; object-src 'none'; frame-src 'none'; base-uri 'self'; form-action 'self'; manifest-src 'self'; worker-src 'self'" always; + add_header X-Content-Type-Options "nosniff" always; + add_header Referrer-Policy "no-referrer" always; + add_header Permissions-Policy "camera=(), microphone=(), geolocation=()" always; + add_header X-Frame-Options "SAMEORIGIN" always; + + location /v1/ { + proxy_pass http://127.0.0.1:8787/v1/; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + client_max_body_size 50M; + } + + location /health { + proxy_pass http://127.0.0.1:8787/health; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + } + + location /ready { + proxy_pass http://127.0.0.1:8787/ready; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + } + + location /assets/ { + add_header Content-Security-Policy "default-src 'self'; script-src 'self'; style-src 'self' 'unsafe-inline'; img-src 'self' data: blob: file:; media-src 'self' data: blob: file:; font-src 'self' data:; connect-src 'self' https: http://localhost:* ws://localhost:*; object-src 'none'; frame-src 'none'; base-uri 'self'; form-action 'self'; manifest-src 'self'; worker-src 'self'" always; + add_header X-Content-Type-Options "nosniff" always; + add_header Referrer-Policy "no-referrer" always; + add_header Permissions-Policy "camera=(), microphone=(), geolocation=()" always; + add_header X-Frame-Options "SAMEORIGIN" always; + add_header Cache-Control "public, max-age=31536000, immutable" always; + try_files $uri =404; + } + + location / { + add_header Content-Security-Policy "default-src 'self'; script-src 'self'; style-src 'self' 'unsafe-inline'; img-src 'self' data: blob: file:; media-src 'self' data: blob: file:; font-src 'self' data:; connect-src 'self' https: http://localhost:* ws://localhost:*; object-src 'none'; frame-src 'none'; base-uri 'self'; form-action 'self'; manifest-src 'self'; worker-src 'self'" always; + add_header X-Content-Type-Options "nosniff" always; + add_header Referrer-Policy "no-referrer" always; + add_header Permissions-Policy "camera=(), microphone=(), geolocation=()" always; + add_header X-Frame-Options "SAMEORIGIN" always; + add_header Cache-Control "no-cache" always; + try_files $uri /index.html; + } + } +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: mindwtr + namespace: {{ .Release.Namespace }} + labels: + io.kompose.service: mindwtr +spec: + replicas: {{ .Values.workloads.mindwtr.replicaCount }} + selector: + matchLabels: + io.kompose.service: mindwtr + strategy: + type: Recreate + template: + metadata: + labels: + io.kompose.service: mindwtr + spec: + securityContext: + fsGroup: 1000 + containers: + - name: mindwtr-app + image: "{{ .Values.image.app.repository }}:{{ .Values.image.app.tag }}" + imagePullPolicy: {{ .Values.image.app.pullPolicy | default "IfNotPresent" }} + ports: + - name: http + containerPort: 5173 + protocol: TCP + volumeMounts: + - name: nginx-conf + mountPath: /etc/nginx/conf.d/default.conf + subPath: default.conf + resources: + requests: + cpu: 50m + memory: 64Mi + limits: + cpu: 500m + memory: 256Mi + - name: mindwtr-cloud + image: "{{ .Values.image.cloud.repository }}:{{ .Values.image.cloud.tag }}" + imagePullPolicy: {{ .Values.image.cloud.pullPolicy | default "IfNotPresent" }} + env: + - name: MINDWTR_CLOUD_DATA_DIR + value: "/app/cloud_data" + - name: MINDWTR_CLOUD_CORS_ORIGIN + value: "http://localhost:5173" + - name: MINDWTR_CLOUD_ALLOW_ANY_TOKEN + value: {{ .Values.cloud.allowAnyToken | default "true" | quote }} + {{- if .Values.cloud.authTokens }} + - name: MINDWTR_CLOUD_AUTH_TOKENS + value: {{ .Values.cloud.authTokens | quote }} + {{- end }} + ports: + - name: cloud + containerPort: 8787 + protocol: TCP + volumeMounts: + - name: mindwtr-data + mountPath: /app/cloud_data + resources: + requests: + cpu: 100m + memory: 128Mi + limits: + cpu: 1000m + memory: 512Mi + restartPolicy: Always + volumes: + - name: nginx-conf + configMap: + name: mindwtr-nginx-conf + - name: mindwtr-data + hostPath: + type: DirectoryOrCreate + path: '{{ .Values.userspace.appData }}/mindwtr' +--- +apiVersion: v1 +kind: Service +metadata: + name: mindwtr-service + namespace: {{ .Release.Namespace }} + labels: + io.kompose.service: mindwtr +spec: + ports: + - name: http + port: 5173 + targetPort: 5173 + protocol: TCP + - name: cloud + port: 8787 + targetPort: 8787 + protocol: TCP + selector: + io.kompose.service: mindwtr diff --git a/mindwtr/values.yaml b/mindwtr/values.yaml new file mode 100644 index 000000000..73f524bc0 --- /dev/null +++ b/mindwtr/values.yaml @@ -0,0 +1,22 @@ +image: + app: + repository: ghcr.io/dongdongbh/mindwtr-app + tag: 1.3.3 + pullPolicy: IfNotPresent + cloud: + repository: ghcr.io/dongdongbh/mindwtr-cloud + tag: 1.3.3 + pullPolicy: IfNotPresent + +userspace: + appData: "" + +workloads: + mindwtr: + replicaCount: 1 + +cloud: + # Allows any valid Bearer token (min 20 chars) to claim a private dataset namespace + allowAnyToken: "true" + # Optional explicit comma-separated auth tokens (min 20 chars each) + authTokens: ""