flowforge-io 1.1.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (212) hide show
  1. flowforge_io-1.1.0/LICENSE +21 -0
  2. flowforge_io-1.1.0/PKG-INFO +502 -0
  3. flowforge_io-1.1.0/README.md +392 -0
  4. flowforge_io-1.1.0/flowforge/__init__.py +1 -0
  5. flowforge_io-1.1.0/flowforge/api/__init__.py +0 -0
  6. flowforge_io-1.1.0/flowforge/api/app.py +233 -0
  7. flowforge_io-1.1.0/flowforge/api/auth.py +153 -0
  8. flowforge_io-1.1.0/flowforge/api/routes/__init__.py +0 -0
  9. flowforge_io-1.1.0/flowforge/api/routes/ai.py +310 -0
  10. flowforge_io-1.1.0/flowforge/api/routes/audit.py +114 -0
  11. flowforge_io-1.1.0/flowforge/api/routes/auth.py +56 -0
  12. flowforge_io-1.1.0/flowforge/api/routes/bulk_loads.py +118 -0
  13. flowforge_io-1.1.0/flowforge/api/routes/connections.py +230 -0
  14. flowforge_io-1.1.0/flowforge/api/routes/emails.py +171 -0
  15. flowforge_io-1.1.0/flowforge/api/routes/metrics.py +60 -0
  16. flowforge_io-1.1.0/flowforge/api/routes/mfa.py +204 -0
  17. flowforge_io-1.1.0/flowforge/api/routes/password_reset.py +150 -0
  18. flowforge_io-1.1.0/flowforge/api/routes/pipelines.py +722 -0
  19. flowforge_io-1.1.0/flowforge/api/routes/projects.py +125 -0
  20. flowforge_io-1.1.0/flowforge/api/routes/providers.py +118 -0
  21. flowforge_io-1.1.0/flowforge/api/routes/recipients.py +95 -0
  22. flowforge_io-1.1.0/flowforge/api/routes/reports.py +148 -0
  23. flowforge_io-1.1.0/flowforge/api/routes/runs.py +361 -0
  24. flowforge_io-1.1.0/flowforge/api/routes/setup.py +93 -0
  25. flowforge_io-1.1.0/flowforge/api/routes/sso.py +294 -0
  26. flowforge_io-1.1.0/flowforge/api/routes/steps.py +116 -0
  27. flowforge_io-1.1.0/flowforge/api/routes/users.py +194 -0
  28. flowforge_io-1.1.0/flowforge/api/serializers.py +41 -0
  29. flowforge_io-1.1.0/flowforge/api/validators.py +73 -0
  30. flowforge_io-1.1.0/flowforge/audit.py +226 -0
  31. flowforge_io-1.1.0/flowforge/celery_app.py +65 -0
  32. flowforge_io-1.1.0/flowforge/cli.py +477 -0
  33. flowforge_io-1.1.0/flowforge/connections/__init__.py +0 -0
  34. flowforge_io-1.1.0/flowforge/connections/base.py +34 -0
  35. flowforge_io-1.1.0/flowforge/connections/factory.py +64 -0
  36. flowforge_io-1.1.0/flowforge/connections/mssql.py +105 -0
  37. flowforge_io-1.1.0/flowforge/connections/mysql.py +92 -0
  38. flowforge_io-1.1.0/flowforge/connections/odbc.py +96 -0
  39. flowforge_io-1.1.0/flowforge/connections/oracle.py +101 -0
  40. flowforge_io-1.1.0/flowforge/connections/postgres.py +76 -0
  41. flowforge_io-1.1.0/flowforge/connections/ssh.py +128 -0
  42. flowforge_io-1.1.0/flowforge/crypto.py +85 -0
  43. flowforge_io-1.1.0/flowforge/db/__init__.py +0 -0
  44. flowforge_io-1.1.0/flowforge/db/migrations/__init__.py +0 -0
  45. flowforge_io-1.1.0/flowforge/db/migrations/env.py +71 -0
  46. flowforge_io-1.1.0/flowforge/db/migrations/versions/0001_baseline.py +213 -0
  47. flowforge_io-1.1.0/flowforge/db/migrations/versions/0002_timezone_timestamps.py +50 -0
  48. flowforge_io-1.1.0/flowforge/db/migrations/versions/0003_indexes_and_constraints.py +53 -0
  49. flowforge_io-1.1.0/flowforge/db/migrations/versions/0004_json_report_format.py +32 -0
  50. flowforge_io-1.1.0/flowforge/db/migrations/versions/0005_bulk_load_configs.py +60 -0
  51. flowforge_io-1.1.0/flowforge/db/migrations/versions/0006_projects.py +70 -0
  52. flowforge_io-1.1.0/flowforge/db/migrations/versions/0007_pipeline_variables_index.py +29 -0
  53. flowforge_io-1.1.0/flowforge/db/migrations/versions/0008_token_blocklist.py +30 -0
  54. flowforge_io-1.1.0/flowforge/db/migrations/versions/0009_narrow_db_type_constraint.py +38 -0
  55. flowforge_io-1.1.0/flowforge/db/migrations/versions/0010_webhook_tokens.py +37 -0
  56. flowforge_io-1.1.0/flowforge/db/migrations/versions/0011_fix_step_type_constraint.py +37 -0
  57. flowforge_io-1.1.0/flowforge/db/migrations/versions/0012_onedrive_support.py +47 -0
  58. flowforge_io-1.1.0/flowforge/db/migrations/versions/0013_ai_analyze_step.py +41 -0
  59. flowforge_io-1.1.0/flowforge/db/migrations/versions/0014_sftp_transfer_step.py +41 -0
  60. flowforge_io-1.1.0/flowforge/db/migrations/versions/0015_datetime_timezone.py +69 -0
  61. flowforge_io-1.1.0/flowforge/db/migrations/versions/0016_pipeline_failure_webhook.py +26 -0
  62. flowforge_io-1.1.0/flowforge/db/migrations/versions/0017_mysql_connection_type.py +32 -0
  63. flowforge_io-1.1.0/flowforge/db/migrations/versions/0018_user_role.py +32 -0
  64. flowforge_io-1.1.0/flowforge/db/migrations/versions/0019_backfill_admin_role.py +33 -0
  65. flowforge_io-1.1.0/flowforge/db/migrations/versions/0020_mfa_sso.py +38 -0
  66. flowforge_io-1.1.0/flowforge/db/migrations/versions/0021_mssql_odbc_pwreset.py +55 -0
  67. flowforge_io-1.1.0/flowforge/db/migrations/versions/0023_pipeline_deps_parallel.py +57 -0
  68. flowforge_io-1.1.0/flowforge/db/migrations/versions/0024_report_column_formatting.py +33 -0
  69. flowforge_io-1.1.0/flowforge/db/migrations/versions/0025_new_providers_notification.py +57 -0
  70. flowforge_io-1.1.0/flowforge/db/migrations/versions/6158f44dafca_add_auditlog_model.py +44 -0
  71. flowforge_io-1.1.0/flowforge/db/migrations/versions/9c08f36f9ef8_add_send_only_on_failure_to_ff_pipelines.py +28 -0
  72. flowforge_io-1.1.0/flowforge/db/migrations/versions/__init__.py +0 -0
  73. flowforge_io-1.1.0/flowforge/db/migrations/versions/b7a76582c1ea_add_sshconnection_and_update_step_type_.py +57 -0
  74. flowforge_io-1.1.0/flowforge/db/migrations/versions/c4e8f2a1b9d3_add_ssh_health_check_step_type.py +44 -0
  75. flowforge_io-1.1.0/flowforge/db/models.py +389 -0
  76. flowforge_io-1.1.0/flowforge/email_providers/__init__.py +0 -0
  77. flowforge_io-1.1.0/flowforge/email_providers/base.py +27 -0
  78. flowforge_io-1.1.0/flowforge/email_providers/factory.py +92 -0
  79. flowforge_io-1.1.0/flowforge/email_providers/gmail.py +96 -0
  80. flowforge_io-1.1.0/flowforge/email_providers/mailgun.py +85 -0
  81. flowforge_io-1.1.0/flowforge/email_providers/microsoft365.py +103 -0
  82. flowforge_io-1.1.0/flowforge/email_providers/sendgrid.py +82 -0
  83. flowforge_io-1.1.0/flowforge/email_providers/ses.py +103 -0
  84. flowforge_io-1.1.0/flowforge/email_providers/smtp.py +93 -0
  85. flowforge_io-1.1.0/flowforge/engine/__init__.py +0 -0
  86. flowforge_io-1.1.0/flowforge/engine/cleanup.py +57 -0
  87. flowforge_io-1.1.0/flowforge/engine/context.py +229 -0
  88. flowforge_io-1.1.0/flowforge/engine/launcher.py +97 -0
  89. flowforge_io-1.1.0/flowforge/engine/loader.py +83 -0
  90. flowforge_io-1.1.0/flowforge/engine/runner.py +511 -0
  91. flowforge_io-1.1.0/flowforge/engine/scheduler.py +244 -0
  92. flowforge_io-1.1.0/flowforge/engine/shutdown.py +155 -0
  93. flowforge_io-1.1.0/flowforge/reports/__init__.py +0 -0
  94. flowforge_io-1.1.0/flowforge/reports/csv_report.py +24 -0
  95. flowforge_io-1.1.0/flowforge/reports/excel_report.py +127 -0
  96. flowforge_io-1.1.0/flowforge/reports/health_report.py +75 -0
  97. flowforge_io-1.1.0/flowforge/reports/json_report.py +20 -0
  98. flowforge_io-1.1.0/flowforge/reports/pdf_report.py +73 -0
  99. flowforge_io-1.1.0/flowforge/steps/__init__.py +0 -0
  100. flowforge_io-1.1.0/flowforge/steps/ai_analyze.py +188 -0
  101. flowforge_io-1.1.0/flowforge/steps/base.py +54 -0
  102. flowforge_io-1.1.0/flowforge/steps/bulk_load.py +528 -0
  103. flowforge_io-1.1.0/flowforge/steps/data_load.py +305 -0
  104. flowforge_io-1.1.0/flowforge/steps/db_health_check.py +211 -0
  105. flowforge_io-1.1.0/flowforge/steps/db_procedure.py +50 -0
  106. flowforge_io-1.1.0/flowforge/steps/db_query.py +133 -0
  107. flowforge_io-1.1.0/flowforge/steps/drive_upload.py +34 -0
  108. flowforge_io-1.1.0/flowforge/steps/email_step.py +222 -0
  109. flowforge_io-1.1.0/flowforge/steps/notification.py +136 -0
  110. flowforge_io-1.1.0/flowforge/steps/onedrive_upload.py +35 -0
  111. flowforge_io-1.1.0/flowforge/steps/report.py +118 -0
  112. flowforge_io-1.1.0/flowforge/steps/script_report.py +125 -0
  113. flowforge_io-1.1.0/flowforge/steps/sftp_transfer.py +367 -0
  114. flowforge_io-1.1.0/flowforge/steps/ssh_command.py +113 -0
  115. flowforge_io-1.1.0/flowforge/steps/ssh_health_check.py +170 -0
  116. flowforge_io-1.1.0/flowforge/storage/__init__.py +0 -0
  117. flowforge_io-1.1.0/flowforge/storage/google_drive.py +90 -0
  118. flowforge_io-1.1.0/flowforge/storage/onedrive.py +137 -0
  119. flowforge_io-1.1.0/flowforge/tasks.py +44 -0
  120. flowforge_io-1.1.0/flowforge_io.egg-info/PKG-INFO +502 -0
  121. flowforge_io-1.1.0/flowforge_io.egg-info/SOURCES.txt +210 -0
  122. flowforge_io-1.1.0/flowforge_io.egg-info/dependency_links.txt +1 -0
  123. flowforge_io-1.1.0/flowforge_io.egg-info/entry_points.txt +2 -0
  124. flowforge_io-1.1.0/flowforge_io.egg-info/requires.txt +78 -0
  125. flowforge_io-1.1.0/flowforge_io.egg-info/top_level.txt +1 -0
  126. flowforge_io-1.1.0/pyproject.toml +152 -0
  127. flowforge_io-1.1.0/setup.cfg +4 -0
  128. flowforge_io-1.1.0/tests/test_ai.py +359 -0
  129. flowforge_io-1.1.0/tests/test_ai_analyze.py +371 -0
  130. flowforge_io-1.1.0/tests/test_app_coverage.py +134 -0
  131. flowforge_io-1.1.0/tests/test_audit.py +371 -0
  132. flowforge_io-1.1.0/tests/test_audit_routes.py +165 -0
  133. flowforge_io-1.1.0/tests/test_auth.py +180 -0
  134. flowforge_io-1.1.0/tests/test_auth_coverage.py +162 -0
  135. flowforge_io-1.1.0/tests/test_bulk_load_configs.py +161 -0
  136. flowforge_io-1.1.0/tests/test_bulk_load_step.py +518 -0
  137. flowforge_io-1.1.0/tests/test_bulk_loads_coverage.py +103 -0
  138. flowforge_io-1.1.0/tests/test_cleanup.py +141 -0
  139. flowforge_io-1.1.0/tests/test_connections.py +227 -0
  140. flowforge_io-1.1.0/tests/test_connections_coverage.py +189 -0
  141. flowforge_io-1.1.0/tests/test_connections_factory.py +84 -0
  142. flowforge_io-1.1.0/tests/test_connections_factory_coverage.py +147 -0
  143. flowforge_io-1.1.0/tests/test_connections_mssql_odbc.py +276 -0
  144. flowforge_io-1.1.0/tests/test_context.py +508 -0
  145. flowforge_io-1.1.0/tests/test_cron_endpoint.py +81 -0
  146. flowforge_io-1.1.0/tests/test_crypto.py +75 -0
  147. flowforge_io-1.1.0/tests/test_crypto_file_encryption.py +75 -0
  148. flowforge_io-1.1.0/tests/test_data_load_create.py +321 -0
  149. flowforge_io-1.1.0/tests/test_data_load_step.py +493 -0
  150. flowforge_io-1.1.0/tests/test_db_health_check.py +186 -0
  151. flowforge_io-1.1.0/tests/test_db_health_check_coverage.py +182 -0
  152. flowforge_io-1.1.0/tests/test_db_procedure_unit.py +95 -0
  153. flowforge_io-1.1.0/tests/test_db_query_capture.py +139 -0
  154. flowforge_io-1.1.0/tests/test_drive_upload_step.py +220 -0
  155. flowforge_io-1.1.0/tests/test_email_configs.py +152 -0
  156. flowforge_io-1.1.0/tests/test_email_providers.py +291 -0
  157. flowforge_io-1.1.0/tests/test_email_providers_ses_sg_mg.py +339 -0
  158. flowforge_io-1.1.0/tests/test_email_providers_unit.py +370 -0
  159. flowforge_io-1.1.0/tests/test_email_step_coverage.py +150 -0
  160. flowforge_io-1.1.0/tests/test_email_step_unit.py +384 -0
  161. flowforge_io-1.1.0/tests/test_emails_coverage.py +92 -0
  162. flowforge_io-1.1.0/tests/test_excel_report_coverage.py +168 -0
  163. flowforge_io-1.1.0/tests/test_jinja_errors.py +90 -0
  164. flowforge_io-1.1.0/tests/test_jwt_expiry.py +77 -0
  165. flowforge_io-1.1.0/tests/test_launcher_extended.py +88 -0
  166. flowforge_io-1.1.0/tests/test_launcher_unit.py +152 -0
  167. flowforge_io-1.1.0/tests/test_loader_unit.py +285 -0
  168. flowforge_io-1.1.0/tests/test_metrics_coverage.py +55 -0
  169. flowforge_io-1.1.0/tests/test_mfa.py +206 -0
  170. flowforge_io-1.1.0/tests/test_mysql.py +259 -0
  171. flowforge_io-1.1.0/tests/test_mysql_extended.py +79 -0
  172. flowforge_io-1.1.0/tests/test_notification_step.py +208 -0
  173. flowforge_io-1.1.0/tests/test_onedrive.py +265 -0
  174. flowforge_io-1.1.0/tests/test_oracle.py +415 -0
  175. flowforge_io-1.1.0/tests/test_oracle_bulk_load.py +953 -0
  176. flowforge_io-1.1.0/tests/test_password_reset.py +194 -0
  177. flowforge_io-1.1.0/tests/test_pipeline_variables.py +236 -0
  178. flowforge_io-1.1.0/tests/test_pipelines.py +193 -0
  179. flowforge_io-1.1.0/tests/test_pipelines_extended_coverage.py +337 -0
  180. flowforge_io-1.1.0/tests/test_postgres_unit.py +109 -0
  181. flowforge_io-1.1.0/tests/test_projects.py +293 -0
  182. flowforge_io-1.1.0/tests/test_providers_extended.py +101 -0
  183. flowforge_io-1.1.0/tests/test_rbac.py +189 -0
  184. flowforge_io-1.1.0/tests/test_recipients.py +61 -0
  185. flowforge_io-1.1.0/tests/test_report_e2e.py +171 -0
  186. flowforge_io-1.1.0/tests/test_report_generators.py +369 -0
  187. flowforge_io-1.1.0/tests/test_report_step_coverage.py +116 -0
  188. flowforge_io-1.1.0/tests/test_reports.py +116 -0
  189. flowforge_io-1.1.0/tests/test_runner.py +458 -0
  190. flowforge_io-1.1.0/tests/test_runner_extended.py +555 -0
  191. flowforge_io-1.1.0/tests/test_runs.py +163 -0
  192. flowforge_io-1.1.0/tests/test_runs_api.py +522 -0
  193. flowforge_io-1.1.0/tests/test_runs_extended.py +321 -0
  194. flowforge_io-1.1.0/tests/test_scheduler.py +353 -0
  195. flowforge_io-1.1.0/tests/test_scheduler_prune.py +330 -0
  196. flowforge_io-1.1.0/tests/test_script_report.py +84 -0
  197. flowforge_io-1.1.0/tests/test_serializers.py +267 -0
  198. flowforge_io-1.1.0/tests/test_setup_extended.py +160 -0
  199. flowforge_io-1.1.0/tests/test_sftp.py +574 -0
  200. flowforge_io-1.1.0/tests/test_shutdown.py +203 -0
  201. flowforge_io-1.1.0/tests/test_shutdown_cancel_runs.py +116 -0
  202. flowforge_io-1.1.0/tests/test_smart_attachments.py +152 -0
  203. flowforge_io-1.1.0/tests/test_smtp_test_method.py +99 -0
  204. flowforge_io-1.1.0/tests/test_ssh_command.py +229 -0
  205. flowforge_io-1.1.0/tests/test_ssh_connection_unit.py +437 -0
  206. flowforge_io-1.1.0/tests/test_ssh_health_check.py +221 -0
  207. flowforge_io-1.1.0/tests/test_sso.py +714 -0
  208. flowforge_io-1.1.0/tests/test_steps_db.py +313 -0
  209. flowforge_io-1.1.0/tests/test_steps_extended.py +218 -0
  210. flowforge_io-1.1.0/tests/test_users.py +224 -0
  211. flowforge_io-1.1.0/tests/test_validators.py +275 -0
  212. flowforge_io-1.1.0/tests/test_webhook.py +198 -0
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 FlowForge Contributors
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,502 @@
1
+ Metadata-Version: 2.4
2
+ Name: flowforge-io
3
+ Version: 1.1.0
4
+ Summary: Database-driven pipeline orchestrator. Configure everything from the UI — no YAML required.
5
+ License: MIT License
6
+
7
+ Copyright (c) 2026 FlowForge Contributors
8
+
9
+ Permission is hereby granted, free of charge, to any person obtaining a copy
10
+ of this software and associated documentation files (the "Software"), to deal
11
+ in the Software without restriction, including without limitation the rights
12
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
13
+ copies of the Software, and to permit persons to whom the Software is
14
+ furnished to do so, subject to the following conditions:
15
+
16
+ The above copyright notice and this permission notice shall be included in all
17
+ copies or substantial portions of the Software.
18
+
19
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
20
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
21
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
22
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
23
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
24
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
25
+ SOFTWARE.
26
+
27
+ Project-URL: Homepage, https://github.com/jagdeepvirdi/flowforge
28
+ Project-URL: Documentation, https://github.com/jagdeepvirdi/flowforge/blob/main/docs/getting-started.md
29
+ Project-URL: Bug Tracker, https://github.com/jagdeepvirdi/flowforge/issues
30
+ Keywords: pipeline,orchestration,automation,reporting,scheduling
31
+ Classifier: Development Status :: 3 - Alpha
32
+ Classifier: Intended Audience :: Developers
33
+ Classifier: Intended Audience :: System Administrators
34
+ Classifier: License :: OSI Approved :: MIT License
35
+ Classifier: Programming Language :: Python :: 3
36
+ Classifier: Programming Language :: Python :: 3.11
37
+ Classifier: Programming Language :: Python :: 3.12
38
+ Classifier: Topic :: Office/Business
39
+ Classifier: Topic :: Database
40
+ Classifier: Topic :: System :: Monitoring
41
+ Requires-Python: >=3.11
42
+ Description-Content-Type: text/markdown
43
+ License-File: LICENSE
44
+ Requires-Dist: flask>=3.0
45
+ Requires-Dist: flask-sqlalchemy>=3.1
46
+ Requires-Dist: psycopg2-binary>=2.9
47
+ Requires-Dist: sqlalchemy>=2.0
48
+ Requires-Dist: apscheduler>=3.10
49
+ Requires-Dist: jinja2>=3.1
50
+ Requires-Dist: openpyxl>=3.1
51
+ Requires-Dist: click>=8.1
52
+ Requires-Dist: cryptography>=42.0
53
+ Requires-Dist: PyJWT>=2.8
54
+ Requires-Dist: bcrypt>=4.1
55
+ Requires-Dist: pyotp>=2.9
56
+ Requires-Dist: flask-cors>=4.0
57
+ Requires-Dist: flask-limiter>=3.8
58
+ Requires-Dist: python-dotenv>=1.0
59
+ Requires-Dist: pyyaml>=6.0
60
+ Requires-Dist: alembic>=1.13
61
+ Provides-Extra: gmail
62
+ Requires-Dist: google-api-python-client>=2.120; extra == "gmail"
63
+ Requires-Dist: google-auth>=2.28; extra == "gmail"
64
+ Requires-Dist: google-auth-oauthlib>=1.2; extra == "gmail"
65
+ Provides-Extra: drive
66
+ Requires-Dist: google-api-python-client>=2.120; extra == "drive"
67
+ Requires-Dist: google-auth>=2.28; extra == "drive"
68
+ Provides-Extra: microsoft365
69
+ Requires-Dist: msal>=1.28; extra == "microsoft365"
70
+ Requires-Dist: requests>=2.31; extra == "microsoft365"
71
+ Provides-Extra: pdf
72
+ Requires-Dist: weasyprint>=62.0; extra == "pdf"
73
+ Provides-Extra: oracle
74
+ Requires-Dist: oracledb>=2.0; extra == "oracle"
75
+ Provides-Extra: mysql
76
+ Requires-Dist: pymysql>=1.1; extra == "mysql"
77
+ Requires-Dist: cryptography>=42.0; extra == "mysql"
78
+ Provides-Extra: sftp
79
+ Requires-Dist: paramiko>=3.0; extra == "sftp"
80
+ Provides-Extra: mssql
81
+ Requires-Dist: pyodbc>=5.0; extra == "mssql"
82
+ Provides-Extra: ses
83
+ Requires-Dist: boto3>=1.34; extra == "ses"
84
+ Provides-Extra: claude
85
+ Requires-Dist: anthropic>=0.25; extra == "claude"
86
+ Provides-Extra: sso
87
+ Requires-Dist: google-auth-oauthlib>=1.2; extra == "sso"
88
+ Requires-Dist: msal>=1.28; extra == "sso"
89
+ Requires-Dist: requests>=2.31; extra == "sso"
90
+ Provides-Extra: all
91
+ Requires-Dist: flowforge-io[gmail]; extra == "all"
92
+ Requires-Dist: flowforge-io[drive]; extra == "all"
93
+ Requires-Dist: flowforge-io[microsoft365]; extra == "all"
94
+ Requires-Dist: flowforge-io[pdf]; extra == "all"
95
+ Requires-Dist: flowforge-io[oracle]; extra == "all"
96
+ Requires-Dist: flowforge-io[mysql]; extra == "all"
97
+ Requires-Dist: flowforge-io[sftp]; extra == "all"
98
+ Requires-Dist: flowforge-io[mssql]; extra == "all"
99
+ Requires-Dist: flowforge-io[ses]; extra == "all"
100
+ Requires-Dist: flowforge-io[sso]; extra == "all"
101
+ Provides-Extra: dev
102
+ Requires-Dist: pytest>=8.0; extra == "dev"
103
+ Requires-Dist: pytest-mock>=3.12; extra == "dev"
104
+ Requires-Dist: pytest-cov>=5.0; extra == "dev"
105
+ Requires-Dist: responses>=0.25; extra == "dev"
106
+ Requires-Dist: ruff>=0.4; extra == "dev"
107
+ Requires-Dist: bandit[toml]>=1.7; extra == "dev"
108
+ Requires-Dist: hypothesis>=6.0; extra == "dev"
109
+ Dynamic: license-file
110
+
111
+ # FlowForge
112
+
113
+ **Database-driven pipeline orchestrator. Configure everything from the UI — DB procedures, reports, email (Gmail/M365/SMTP), Google Drive, OneDrive, SFTP, smart attachments, scheduling. No YAML. No Airflow complexity.**
114
+
115
+ [![Tests](https://github.com/jagdeepvirdi/flowforge/actions/workflows/test.yml/badge.svg)](https://github.com/jagdeepvirdi/flowforge/actions/workflows/test.yml)
116
+ [![codecov](https://codecov.io/gh/jagdeepvirdi/flowforge/graph/badge.svg)](https://codecov.io/gh/jagdeepvirdi/flowforge)
117
+ [![Quality Gate Status](https://sonarcloud.io/api/project_badges/measure?project=jagdeepvirdi_flowforge&metric=alert_status)](https://sonarcloud.io/summary/new_code?id=jagdeepvirdi_flowforge)
118
+ [![OpenSSF Best Practices](https://www.bestpractices.dev/projects/13002/badge)](https://www.bestpractices.dev/projects/13002)
119
+ [![OpenSSF Scorecard](https://api.securityscorecards.dev/projects/github.com/jagdeepvirdi/flowforge/badge)](https://securityscorecards.dev/viewer/?uri=github.com/jagdeepvirdi/flowforge)
120
+ [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
121
+
122
+ ---
123
+
124
+ ## What is FlowForge?
125
+
126
+ FlowForge runs ordered data pipelines: call database procedures, run queries, generate reports (Excel/PDF/CSV/JSON), send emails with smart attachment handling, upload files to Google Drive or OneDrive, and transfer files over SFTP. Everything is configured through a web frontend — no config files to edit, no Python DAGs to write.
127
+
128
+ Designed for solo developers, data analysts, and small teams who need lightweight automation without the overhead of enterprise orchestration tools.
129
+
130
+ ---
131
+
132
+ ## Features
133
+
134
+ ### Pipeline Engine
135
+ - **No-YAML config** — pipelines, reports, email templates, and schedules are all managed in the UI
136
+ - **Multi-project workspace** — organize resources by team or department in one instance
137
+ - **10 step types** — db_procedure, db_query, report, email, drive_upload, onedrive_upload, data_load, bulk_load, sftp_transfer, ai_analyze
138
+ - **Step retry** — configurable retry count (0–10) and backoff delay per step
139
+ - **On-error control** — per-step `stop` or `continue` on failure
140
+ - **Failure webhook** — POST notification to any URL when a pipeline fails
141
+ - **Pipeline clone** — duplicate a pipeline with one click
142
+ - **YAML import/export** — from UI or CLI; useful for version control and migration
143
+
144
+ ### Databases & Storage
145
+ - **Database support**: PostgreSQL, Oracle (`python-oracledb`, thin mode — no Instant Client), MySQL / MariaDB
146
+ - **Google Drive**: upload files, create shareable links, smart attachment fallback
147
+ - **OneDrive / SharePoint**: upload files via Microsoft Graph API, chunked upload for large files, shareable links
148
+ - **SFTP**: download or upload files; password or private-key auth (RSA / ECDSA / Ed25519)
149
+
150
+ ### Email & Reports
151
+ - **Email providers**: Gmail (OAuth2), Microsoft 365 (MSAL + Graph API), SMTP (any server)
152
+ - **Smart attachments**: files over a configurable size threshold are automatically uploaded to Drive or OneDrive; the email body gets a shareable link instead
153
+ - **Query results in email**: embed live SQL query results — HTML table, key-value summary, or custom Jinja2 — directly in email bodies
154
+ - **Report formats**: Excel (openpyxl, optional template), CSV, PDF (WeasyPrint), JSON
155
+
156
+ ### Multi-User & Access Control
157
+ - **Roles**: `admin`, `editor`, `viewer` — enforced on every API route and in the UI
158
+ - **User management**: admin UI to create users, change roles, delete accounts
159
+ - **Self-service password change**: any authenticated user can change their own password
160
+ - **JWT with revocation**: server-side token blocklist; `POST /api/auth/logout` invalidates the current token immediately
161
+
162
+ ### Scheduling & Reliability
163
+ - **APScheduler** with PostgreSQL jobstore — scheduled jobs survive restarts
164
+ - **Visual cron builder**: frequency presets, live expression preview, next-5-runs display
165
+ - **Hot reload**: schedule changes sync to the scheduler automatically every 60 seconds
166
+ - **Celery / Redis task queue** (optional): when `FLOWFORGE_REDIS_URL` is set, pipeline runs are dispatched as Celery tasks; falls back to background threads without Redis
167
+ - **Graceful shutdown**: SIGTERM handler drains in-flight runs before exit
168
+
169
+ ### AI Features (Ollama or Claude API)
170
+ - **AI chart generator**: "Visualize" button on Report Preview — sends column names + sample rows to Ollama; renders result with Recharts (bar, line, area, pie, scatter)
171
+ - **SQL Explainer**: "Explain" button in the SQL editor — plain-English summary of what a query does
172
+ - **SQL Optimizer**: "Optimize" button — side-by-side diff of original vs AI-suggested rewrite; accept with one click
173
+ - **Pipeline failure diagnosis**: "Explain this error" on failed step logs — 2–4 sentence cause and fix
174
+ - **Data Profiler**: one-click narrative summary of query result (structure, ranges, nulls, outliers)
175
+ - **Run history anomaly alerts**: statistical outlier detection (>2σ) on row counts and durations; Ollama narrative when anomaly is detected
176
+
177
+ ### Security
178
+ - **AES-256-GCM** credential encryption for all DB and email provider configs stored in the database
179
+ - **bcrypt** admin password hashing; separate JWT signing secret from encryption key
180
+ - **Login rate limiting** (10/min per IP) and manual trigger rate limiting
181
+ - **Jinja2 SandboxedEnvironment** — no arbitrary code execution in templates
182
+ - **Env var allowlist** (`FLOWFORGE_TEMPLATE_ENV_VARS`) — restrict which env vars are accessible in templates
183
+ - **Path containment** check on report file download — prevents directory traversal
184
+ - **Procedure name validation** — blocks SQL injection via stored procedure names
185
+ - **SFTP strict host key checking** (`FLOWFORGE_SFTP_STRICT_HOSTKEYS=true`)
186
+ - **Audit log** — every login, pipeline run, config change, and webhook trigger logged with username attribution; file (rotating 10 MB × 5) + structured JSON stdout
187
+ - **SAST in CI** — `bandit` (Python) + `npm audit` on every push
188
+
189
+ ### Developer Experience
190
+ - **In-app help**: context-sensitive help drawer, page intro cards, field tooltips, concept glossary
191
+ - **Webhook / API trigger**: `POST /pipelines/{id}/trigger?token=...` for external integration; per-pipeline tokens with audit trail
192
+ - **Output cleanup**: CLI command + daily scheduler job to prune old report files by TTL
193
+ - **Docker Compose**: one-command local stack (API + frontend + PostgreSQL + scheduler + Redis + Celery worker)
194
+ - **GitHub Actions CI**: full pytest suite + SAST + frontend audit on every push and PR
195
+
196
+ ---
197
+
198
+ ## Comparison
199
+
200
+ | Feature | FlowForge | Airflow | Prefect | Cron + Scripts |
201
+ |---|---|---|---|---|
202
+ | Setup time | Minutes | Hours | Minutes | Minutes |
203
+ | Config interface | Web UI | Python DAGs | Python flows | Edit files |
204
+ | Email sending | Built-in | Plugin | Plugin | DIY |
205
+ | Report generation | Built-in | DIY | DIY | DIY |
206
+ | Google Drive / OneDrive | Built-in | DIY | DIY | DIY |
207
+ | Smart attachments | Built-in | DIY | DIY | DIY |
208
+ | Multi-user roles | Built-in | Built-in | Built-in | DIY |
209
+ | AI analysis | Built-in (Ollama/Claude) | DIY | DIY | DIY |
210
+ | Scheduling | Built-in UI | Built-in | Built-in | OS cron |
211
+ | Run history / logs | Built-in UI | Built-in | Built-in | DIY |
212
+ | SFTP transfer | Built-in | Plugin | Plugin | DIY |
213
+ | Target users | Solo / small teams | Data engineers | Data engineers | Any |
214
+
215
+ ---
216
+
217
+ ## Step Types
218
+
219
+ | Step | What it does |
220
+ |---|---|
221
+ | `db_procedure` | Call a stored procedure or Oracle package |
222
+ | `db_query` | Run a SQL query and write results to a table; capture a scalar or full rows into pipeline context |
223
+ | `report` | Generate Excel / CSV / PDF / JSON from a SQL query |
224
+ | `email` | Send email with smart attachment handling (Drive or OneDrive fallback) |
225
+ | `drive_upload` | Upload a file to Google Drive; get a shareable link |
226
+ | `onedrive_upload` | Upload a file to OneDrive / SharePoint via Microsoft Graph API |
227
+ | `data_load` | Bulk-load data from a file (CSV/Excel) or SQL query into any configured DB; replace or append |
228
+ | `bulk_load` | Scan a directory for files, load to DB, archive after load; PostgreSQL COPY or chunked fallback |
229
+ | `sftp_transfer` | Download or upload files over SFTP; password or private-key auth; glob patterns |
230
+ | `ai_analyze` | Run a SQL query, summarize results with Claude or Ollama; result available as `{{ ai_summary }}` |
231
+
232
+ ---
233
+
234
+ ## Supported Technologies
235
+
236
+ | Category | Technologies |
237
+ |---|---|
238
+ | Databases | PostgreSQL, Oracle (python-oracledb, thin mode), MySQL / MariaDB |
239
+ | Email | Gmail (OAuth2), Microsoft 365 (MSAL + Graph API), SMTP (any server) |
240
+ | Cloud Storage | Google Drive, OneDrive / SharePoint |
241
+ | File Transfer | SFTP |
242
+ | Report formats | Excel (.xlsx), CSV, PDF (WeasyPrint), JSON |
243
+ | Scheduling | APScheduler (cron, PostgreSQL jobstore) |
244
+ | Task queue | Celery + Redis (optional — threads used when Redis is not configured) |
245
+ | AI (optional) | Claude API (Anthropic), Ollama (local, zero cost) |
246
+
247
+ ---
248
+
249
+ ## Quick Start
250
+
251
+ ### Option A — Docker Compose (recommended)
252
+
253
+ ```bash
254
+ git clone https://github.com/jagdeepvirdi/flowforge.git
255
+ cd flowforge
256
+ cp .env.example .env
257
+ # Edit .env — set FLOWFORGE_SECRET_KEY and FLOWFORGE_PASSWORD at minimum
258
+ docker compose up
259
+ ```
260
+
261
+ Open `http://localhost:5000`. The stack starts the API, frontend (Nginx), PostgreSQL, scheduler, Redis, and a Celery worker.
262
+
263
+ For Oracle support:
264
+
265
+ ```bash
266
+ docker compose -f docker-compose.yml -f docker-compose.oracle.yml up
267
+ ```
268
+
269
+ ### Option B — Local Development
270
+
271
+ #### 1. Prerequisites
272
+
273
+ - Python 3.11+
274
+ - Node.js 18+
275
+ - PostgreSQL (for FlowForge's own config database)
276
+
277
+ #### 2. Install
278
+
279
+ ```bash
280
+ pip install -e .
281
+ # Optional extras:
282
+ pip install -e ".[pdf]" # PDF report generation (WeasyPrint)
283
+ pip install -e ".[oracle]" # Oracle database support (python-oracledb)
284
+ pip install -e ".[gmail]" # Gmail email provider + Google Drive
285
+ pip install -e ".[microsoft365]" # Microsoft 365 email + OneDrive
286
+ pip install -e ".[mysql]" # MySQL / MariaDB support
287
+ pip install -e ".[sftp]" # SFTP transfer step (paramiko)
288
+ pip install -e ".[all]" # Everything above
289
+ ```
290
+
291
+ #### 3. Configure
292
+
293
+ ```bash
294
+ cp .env.example .env
295
+ # Set FLOWFORGE_DB_URL, FLOWFORGE_SECRET_KEY, and FLOWFORGE_PASSWORD at minimum
296
+ ```
297
+
298
+ #### 4. Initialize the database and create the admin user
299
+
300
+ ```bash
301
+ flowforge db upgrade
302
+ flowforge db seed
303
+ ```
304
+
305
+ #### 5. Start
306
+
307
+ **Windows:**
308
+ ```powershell
309
+ .\flowforge.ps1 start
310
+ ```
311
+
312
+ **macOS / Linux:**
313
+ ```bash
314
+ ./flowforge.sh start
315
+ ```
316
+
317
+ Both scripts start the Flask API, APScheduler, and Vite frontend together. Open `http://localhost:5173`.
318
+
319
+ #### 6. Production mode (serves built frontend from Flask)
320
+
321
+ ```powershell
322
+ .\flowforge.ps1 start -Mode prod # Windows
323
+ ./flowforge.sh start prod # macOS/Linux
324
+ ```
325
+
326
+ #### 7. With Celery task queue (optional)
327
+
328
+ ```bash
329
+ # Start Redis, then run a worker alongside the web server:
330
+ flowforge worker --concurrency 4
331
+ # Or: celery -A flowforge.celery_app worker --concurrency 4 --loglevel info
332
+ ```
333
+
334
+ When `FLOWFORGE_REDIS_URL` is set in `.env`, pipeline runs are dispatched to the Celery worker automatically. Without it, runs execute in background threads.
335
+
336
+ ---
337
+
338
+ ## CLI Reference
339
+
340
+ ```bash
341
+ # Server
342
+ flowforge web # start Flask dev server
343
+ flowforge schedule # start APScheduler daemon
344
+ flowforge worker [--concurrency N] # start Celery worker (requires FLOWFORGE_REDIS_URL)
345
+
346
+ # Pipelines
347
+ flowforge run "Monthly Revenue Report" # run a pipeline by name
348
+ flowforge list # list all pipelines with schedule and status
349
+ flowforge validate "Pipeline Name" # validate pipeline config and connections
350
+ flowforge export "Pipeline Name" # export pipeline as YAML
351
+ flowforge import pipeline.yaml # import pipeline from YAML (--overwrite to replace)
352
+
353
+ # Database
354
+ flowforge db upgrade [revision] # apply Alembic migrations (default: head)
355
+ flowforge db downgrade <revision> # revert migrations
356
+ flowforge db current # show current migration revision
357
+ flowforge db stamp <revision> # mark DB at revision without running migrations
358
+ flowforge db seed # create admin user from env vars (run once after upgrade)
359
+
360
+ # Maintenance
361
+ flowforge cleanup [--days N] [--dry-run] # remove output files older than N days
362
+
363
+ # OAuth2 setup wizards
364
+ flowforge setup gmail
365
+ flowforge setup microsoft365
366
+ ```
367
+
368
+ ---
369
+
370
+ ## Variable System
371
+
372
+ Available in every config field rendered via Jinja2:
373
+
374
+ | Variable | Example value |
375
+ |---|---|
376
+ | `{{ current_date }}` | `2026-05-25` |
377
+ | `{{ current_month }}` | `2026-05` |
378
+ | `{{ current_year }}` | `2026` |
379
+ | `{{ yesterday }}` | `2026-05-24` |
380
+ | `{{ week_start }}` | `2026-05-18` (Monday) |
381
+ | `{{ week_end }}` | `2026-05-24` (Sunday) |
382
+ | `{{ month_start }}` | `2026-05-01` |
383
+ | `{{ month_end }}` | `2026-05-31` |
384
+ | `{{ quarter_start }}` | `2026-04-01` |
385
+ | `{{ quarter_end }}` | `2026-06-30` |
386
+ | `{{ timestamp }}` | `20260525142304` |
387
+ | `{{ run_id }}` | UUID of the current pipeline run |
388
+ | `{{ pipeline_name }}` | `Monthly Revenue Report` |
389
+ | `{{ env.MY_VAR }}` | Any allowed environment variable |
390
+ | `{{ steps.name.output_path }}` | Output file path from a previous step |
391
+ | `{{ steps.name.drive_url }}` | Drive / OneDrive URL from a previous step |
392
+ | `{{ steps.name.rows_affected }}` | Row count from a previous step |
393
+ | `{{ steps.name.table_html }}` | HTML table of captured query rows |
394
+ | `{{ steps.name.ai_summary }}` | AI narrative from an `ai_analyze` step |
395
+ | `{{ my_var }}` / `{{ vars.my_var }}` | Pipeline-level variable (secrets encrypted at rest) |
396
+
397
+ ---
398
+
399
+ ## Multi-User Roles
400
+
401
+ | Role | Permissions |
402
+ |---|---|
403
+ | `admin` | Full access — manage users, connections, providers, all pipeline operations |
404
+ | `editor` | Create / edit / delete pipelines, reports, emails, recipients; run pipelines |
405
+ | `viewer` | Read-only — view pipelines, run history, reports; no write operations |
406
+
407
+ Role is set per user by an admin. The UI automatically hides write actions for viewers.
408
+
409
+ ---
410
+
411
+ ## API Trigger (Webhook)
412
+
413
+ Pipelines can be triggered externally without a UI login:
414
+
415
+ ```bash
416
+ # Create a token in the UI (Settings → Pipeline → Webhook Tokens)
417
+ # Then trigger via HTTP:
418
+ curl -X POST "https://your-flowforge/api/pipelines/{id}/trigger?token=flwf_..."
419
+ ```
420
+
421
+ Returns `{ run_id, status, pipeline_name }` with HTTP 202. The token is audited on every use.
422
+
423
+ ---
424
+
425
+ ## Project Structure
426
+
427
+ ```
428
+ flowforge/
429
+ ├── flowforge/ # Python package
430
+ │ ├── cli.py # Click CLI
431
+ │ ├── celery_app.py # Celery instance + Flask context wiring
432
+ │ ├── tasks.py # Celery task definitions
433
+ │ ├── audit.py # Audit log (file + JSON stdout)
434
+ │ ├── engine/ # runner, scheduler, launcher, context, shutdown
435
+ │ ├── steps/ # db_procedure, db_query, report, email, drive_upload,
436
+ │ │ # onedrive_upload, data_load, bulk_load, sftp_transfer, ai_analyze
437
+ │ ├── connections/ # PostgreSQL, Oracle, MySQL + factory
438
+ │ ├── email_providers/ # Gmail, M365, SMTP + factory
439
+ │ ├── reports/ # Excel, CSV, PDF, JSON generators
440
+ │ ├── storage/ # Google Drive, OneDrive clients
441
+ │ ├── crypto.py # AES-256-GCM credential encryption
442
+ │ ├── db/ # SQLAlchemy models + Alembic migrations (0001–0018)
443
+ │ └── api/ # Flask REST API (routes, auth, validators, serializers)
444
+ ├── frontend/ # React + Vite + TypeScript
445
+ │ └── src/
446
+ │ ├── pages/ # Dashboard, Pipelines, Reports, Emails, Connections,
447
+ │ │ # Recipients, RunHistory, Settings, Users
448
+ │ ├── components/ # pipeline/, email/, report/, shared/
449
+ │ └── lib/ # api.ts, auth.ts, types.ts, store.ts
450
+ ├── docs/ # Guides and runbook
451
+ ├── tests/ # pytest suite (742+ tests)
452
+ ├── .github/workflows/ # GitHub Actions CI
453
+ ├── docker-compose.yml # API + frontend + PostgreSQL + scheduler + Redis + worker
454
+ ├── docker-compose.oracle.yml # Oracle 23c overlay
455
+ ├── flowforge.ps1 # Windows dev/prod startup script
456
+ ├── flowforge.sh # macOS/Linux dev/prod startup script
457
+ ├── pyproject.toml
458
+ ├── .env.example
459
+ └── CHANGELOG.md
460
+ ```
461
+
462
+ ---
463
+
464
+ ## Documentation
465
+
466
+ - [`docs/getting-started.md`](docs/getting-started.md) — end-to-end setup walkthrough
467
+ - [`docs/step-types.md`](docs/step-types.md) — full config reference for all step types
468
+ - [`docs/email-providers.md`](docs/email-providers.md) — SMTP, M365, and Gmail setup guides
469
+ - [`RUNBOOK.md`](RUNBOOK.md) — database migrations, startup sequence, production ops
470
+ - [`CONTRIBUTING.md`](CONTRIBUTING.md) — dev setup, running tests, PR process
471
+ - [`CHANGELOG.md`](CHANGELOG.md) — version history
472
+
473
+ ---
474
+
475
+ ## Roadmap
476
+
477
+ | Version | Status | What shipped |
478
+ |---|---|---|
479
+ | v0.1.0 | ✅ | Pipeline engine, all core step types, all email providers, reports, Drive, scheduler, React frontend, Docker, CI, Alembic, AES-256 encryption, JWT auth |
480
+ | v0.1.3 | ✅ | Oracle Docker, `data_load` step, `python-oracledb` migration, JSON report format, scheduler sync fix, email provider `test()` |
481
+ | v0.1.4 | ✅ | Email preview modal, quick-attach Jinja2, docs from API, UI polish |
482
+ | v1.0.0 | ✅ | Pipeline variables (secrets), `bulk_load` step, multi-project support, query results in email, visual cron builder, run history pagination, loading skeletons, React Hook Form + Zod, error boundaries, CSS design tokens |
483
+ | v1.1.0 | ✅ | MySQL / MariaDB, OneDrive / SharePoint upload, SFTP transfer step, AI features (chart generator, SQL explainer/optimizer, failure diagnosis, data profiler, anomaly alerts), pipeline clone, YAML import/export, step retry + backoff, failure webhook, webhook/API trigger, JWT revocation, RBAC guards, SAST in CI |
484
+ | v1.2.0 | ✅ | Multi-user roles (admin / editor / viewer), user management UI, role-based frontend visibility, Celery / Redis task queue, `flowforge worker` CLI, responsive mobile layout, audit log username attribution |
485
+ | **v2** | Planned | Gunicorn docs, Prometheus metrics endpoint, audit log UI, retention policies, MFA (TOTP), SSO / OAuth2 login, report encryption at rest, GDPR export/deletion |
486
+ | **v3** | Backlog | S3 / Azure Blob, MSSQL / Snowflake, pipeline dependencies, parallel step execution, plugin system, Slack / Teams notifications |
487
+
488
+ ---
489
+
490
+ ## Contributing
491
+
492
+ **Obtain:** Install via Docker Compose (`docker compose up`) or locally — see [Quick Start](#quick-start) above.
493
+
494
+ **Feedback:** Use [GitHub Issues](https://github.com/jagdeepvirdi/flowforge/issues) to report bugs or request features. Please include your FlowForge version, Python version, OS, steps to reproduce, and any relevant log output from `ff_step_runs.logs`.
495
+
496
+ **Contribute:** See [`CONTRIBUTING.md`](CONTRIBUTING.md) for dev setup, running tests, adding step types, and the PR process. All contributions welcome — bug fixes, new step types, documentation improvements, and test coverage.
497
+
498
+ ---
499
+
500
+ ## License
501
+
502
+ MIT — see [LICENSE](LICENSE).