Skip to content

Commit 5bdb988

Browse files
authored
Merge pull request #4 from MaxLuxs/dev
release_0.1.7
2 parents ad52e0f + 89ec391 commit 5bdb988

200 files changed

Lines changed: 6306 additions & 789 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
---
2+
name: Flagent Cloud waitlist
3+
about: Register interest in Flagent Cloud (managed SaaS)
4+
title: '[Cloud waitlist] '
5+
labels: flagent-cloud-waitlist
6+
assignees: ''
7+
---
8+
9+
## I'm interested in Flagent Cloud
10+
11+
<!-- Leave a comment below (e.g. "I'm interested" or your contact email if you want to be notified). No obligation. -->
12+
13+
- **Use case (optional):** e.g. managed flags for a small team, no self-hosting
14+
- **Contact (optional):** email or "notify via GitHub"
15+
16+
We will use this issue to announce when Flagent Cloud is available. Star the repo and watch Releases for updates.

CHANGELOG.md

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,24 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
99

1010
(No changes yet)
1111

12-
## [0.1.6] - 2025-02-08
12+
## [0.1.7] - 2026-03-05
1313

14-
(No changes yet)
14+
### Added
15+
- Backend analytics funnels service and migration for analytics events flag/variant linkage
16+
- Crash and analytics repositories and services wired into routes and application startup
17+
- Frontend analytics dashboard and crash dashboard pages with charts and metrics
18+
- Golden-path script and CLI improvements for end-to-end demo flows
19+
20+
### Changed
21+
- Evaluation routes and services: stricter JSON models, evaluation response mapping and tests
22+
- Error handling middleware: JSON 4xx handling for API paths and more robust application tests
23+
- Marketing/landing pages, blog, and docs updated to reflect analytics and dashboards
24+
25+
### Fixed
26+
- Evaluation tests and application module tests to reflect new error handling and evaluation shape
27+
- Recorder tests (Kafka, Kinesis, PubSub) and evaluation event repository tests for new metrics paths
28+
29+
## [0.1.6] - 2025-02-08
1530

1631
## [0.1.5] - 2025-02-08
1732

@@ -75,7 +90,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7590
### Security
7691
- Added CodeQL security scanning workflow
7792

78-
[Unreleased]: https://github.com/MaxLuxs/Flagent/compare/v0.1.6...HEAD
93+
[Unreleased]: https://github.com/MaxLuxs/Flagent/compare/v0.1.7...HEAD
94+
[0.1.7]: https://github.com/MaxLuxs/Flagent/compare/v0.1.6...v0.1.7
7995
[0.1.6]: https://github.com/MaxLuxs/Flagent/compare/v0.1.5...v0.1.6
8096
[0.1.5]: https://github.com/MaxLuxs/Flagent/compare/v0.1.4...v0.1.5
8197
[0.1.4]: https://github.com/MaxLuxs/Flagent/compare/v0.1.0...v0.1.4

Makefile

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,22 @@ docker-build-run:
4444
@docker build -t flagent:local . && docker run -d -p 18000:18000 --name flagent-local flagent:local
4545
@echo "Flagent running at http://localhost:18000 (admin@local / admin)"
4646

47+
.PHONY: run-flagent
48+
run-flagent:
49+
@echo "Starting Flagent via Docker Compose..."
50+
@docker compose up -d
51+
@echo "Flagent at http://localhost:18000 (admin@local / admin)"
52+
53+
.PHONY: run-sample-ktor
54+
run-sample-ktor:
55+
@echo "Running Ktor sample on port 8080 (requires Flagent at http://localhost:18000)..."
56+
@./gradlew :sample-ktor:runSample --no-daemon
57+
58+
.PHONY: golden-path
59+
golden-path:
60+
@chmod +x scripts/run-golden-path.sh
61+
@./scripts/run-golden-path.sh
62+
4763
.PHONY: lint
4864
lint:
4965
@echo "Running linters..."
@@ -71,6 +87,9 @@ help:
7187
@echo " make docker-build - Build Docker image"
7288
@echo " make docker-run - Run Docker container"
7389
@echo " make docker-build-run - Build and run Docker (detached, http://localhost:18000)"
90+
@echo " make run-flagent - Start Flagent (docker compose up -d)"
91+
@echo " make run-sample-ktor - Run Ktor sample (port 8080)"
92+
@echo " make golden-path - One command: Flagent + seed + Ktor sample"
7493
@echo " make lint - Run linters"
7594
@echo " make test-coverage - Generate test coverage report"
7695
@echo " make serve-docs - Serve documentation locally"

README.md

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -37,11 +37,14 @@
3737
<p>
3838
<a href="#-quick-start">Quick Start</a> •
3939
<a href="https://maxluxs.github.io/Flagent/guides/getting-started.md">Documentation</a> •
40+
<a href="docs/guides/why-flagent.md">Why Flagent</a> •
4041
<a href="#-key-features">Features</a> •
4142
<a href="#-sdks">SDKs</a> •
4243
<a href="#-use-cases">Use Cases</a> •
4344
<a href="docs/guides/pricing-and-editions.md">Pricing & editions</a> •
44-
<a href="docs/guides/roadmap.md">Roadmap</a>
45+
<a href="docs/guides/enterprise.md">Enterprise</a> •
46+
<a href="docs/guides/roadmap.md">Roadmap</a> •
47+
<a href="docs/blog/index.html">Blog</a>
4548
</p>
4649
</div>
4750

@@ -86,6 +89,9 @@ docker pull ghcr.io/maxluxs/flagent
8689
docker run -d --name flagent -p 18000:18000 \
8790
-e FLAGENT_DB_DBDRIVER="sqlite3" \
8891
-e FLAGENT_DB_DBCONNECTIONSTR=":memory:" \
92+
-e FLAGENT_ADMIN_EMAIL="admin@local" \
93+
-e FLAGENT_ADMIN_PASSWORD="admin" \
94+
-e FLAGENT_JWT_AUTH_SECRET="dev-secret-at-least-32-characters-long" \
8995
ghcr.io/maxluxs/flagent
9096

9197
# Open Flagent UI
@@ -103,6 +109,9 @@ docker run -d --name flagent -p 18000:18000 \
103109
-v flagent-db:/data \
104110
-e FLAGENT_DB_DBDRIVER="sqlite3" \
105111
-e FLAGENT_DB_DBCONNECTIONSTR="/data/flagent.sqlite" \
112+
-e FLAGENT_ADMIN_EMAIL="admin@local" \
113+
-e FLAGENT_ADMIN_PASSWORD="admin" \
114+
-e FLAGENT_JWT_AUTH_SECRET="dev-secret-at-least-32-characters-long" \
106115
ghcr.io/maxluxs/flagent
107116

108117
# Open Flagent UI
@@ -345,15 +354,15 @@ repositories {
345354

346355
dependencies {
347356
// Ktor plugin (server)
348-
implementation("com.flagent:ktor-flagent:0.1.6")
357+
implementation("com.flagent:ktor-flagent:0.1.7")
349358
// Kotlin client
350-
implementation("com.flagent:kotlin-client:0.1.6")
359+
implementation("com.flagent:kotlin-client:0.1.7")
351360
// Kotlin Enhanced (offline eval, SSE)
352-
implementation("com.flagent:kotlin-enhanced:0.1.6")
361+
implementation("com.flagent:kotlin-enhanced:0.1.7")
353362
// Kotlin Debug UI
354-
implementation("com.flagent:kotlin-debug-ui:0.1.6")
363+
implementation("com.flagent:kotlin-debug-ui:0.1.7")
355364
// Shared (KMP; pulled transitively by ktor-flagent, or use for multi-platform)
356-
implementation("com.flagent:shared:0.1.6")
365+
implementation("com.flagent:shared:0.1.7")
357366
}
358367
```
359368

VERSION

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
0.1.6
1+
0.1.7

backend/docs/index.html

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -670,7 +670,7 @@
670670
/*!
671671
* json-schema-view-js
672672
* https://github.com/mohsen1/json-schema-view-js#readme
673-
* Version: 0.4.1 - 2015-11-12T17:19:27.615Z
673+
* Version: 0.1.7 - 2015-11-12T17:19:27.615Z
674674
* License: MIT
675675
*/.json-schema-view .toggle-handle:after,.json-schema-view.json-schema-view-dark .toggle-handle:after,json-schema-view .toggle-handle:after,json-schema-view[json-schema-view-dark] .toggle-handle:after{content:"\25BC"}.json-schema-view .title,.json-schema-view.json-schema-view-dark .title,json-schema-view .title,json-schema-view[json-schema-view-dark] .title{font-weight:700;cursor:pointer}.json-schema-view,json-schema-view{font-family:monospace;font-size:0;display:table-cell}.json-schema-view>*,json-schema-view>*{font-size:14px}.json-schema-view .toggle-handle,json-schema-view .toggle-handle{cursor:pointer;margin:auto .3em;font-size:10px;display:inline-block;transform-origin:50% 40%;transition:transform 150ms ease-in}.json-schema-view .toggle-handle,.json-schema-view .toggle-handle:hover,json-schema-view .toggle-handle,json-schema-view .toggle-handle:hover{text-decoration:none;color:#333}.json-schema-view .description,json-schema-view .description{color:gray;font-style:italic}
676676
.pattern {
@@ -965,8 +965,8 @@
965965
"type" : "string",
966966
"description" : "Determine how flagTags is used to filter flags to be evaluated. OR extends the evaluation to those which contains at least one of the provided flagTags or AND limit the evaluation to those which contains all the flagTags.",
967967
"nullable" : true,
968-
"default" : "ANY",
969-
"enum" : [ "ANY", "ALL" ]
968+
"enum" : [ "ANY", "ALL" ],
969+
"default" : "ANY"
970970
}
971971
},
972972
"example" : {
@@ -1115,8 +1115,8 @@
11151115
"type" : "string",
11161116
"description" : "Determine how flagTags is used to filter flags to be evaluated.",
11171117
"nullable" : true,
1118-
"default" : "ANY",
1119-
"enum" : [ "ANY", "ALL" ]
1118+
"enum" : [ "ANY", "ALL" ],
1119+
"default" : "ANY"
11201120
}
11211121
},
11221122
"example" : {
@@ -1355,7 +1355,7 @@
13551355
}
13561356
},
13571357
"example" : {
1358-
"version" : "0.1.6",
1358+
"version" : "0.1.7",
13591359
"buildTime" : "2024-01-01T00:00:00Z",
13601360
"gitCommit" : "abc123"
13611361
}
@@ -1780,7 +1780,7 @@ <h1>Flagent API</h1>
17801780
<div id="header">
17811781
<div id="api-_">
17821782
<h2 id="welcome-to-apidoc">API and SDK Documentation</h2>
1783-
<div class="app-desc">Version: 0.1.6</div>
1783+
<div class="app-desc">Version: 0.1.7</div>
17841784
<hr>
17851785
<div><p>Flagent is a feature flagging, A/B testing and dynamic configuration microservice. The base path for all the APIs is &quot;/api/v1&quot;.</p>
17861786
<h2>Authentication</h2>

backend/src/main/kotlin/flagent/application/Application.kt

Lines changed: 3 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ import flagent.middleware.configureStatsDMetrics
1919
import flagent.repository.Database
2020
import flagent.route.configureAdminUserRoutes
2121
import flagent.route.configureAnalyticsEventsRoutes
22+
import flagent.route.configureAnalyticsFunnelRoutes
2223
import flagent.route.configureAuthRoutes
2324
import flagent.route.configureConstraintRoutes
2425
import flagent.route.configureCoreMetricsRoutes
@@ -226,7 +227,7 @@ fun Application.module() {
226227
} else {
227228
// When JWT is disabled, /admin/* returns 404 with clear message so UI shows it instead of generic "Resource not found"
228229
route("/admin") {
229-
route("{...}") {
230+
route("{path...}") {
230231
get {
231232
call.respondText(
232233
"""{"error":"Admin user management is not enabled. Set FLAGENT_JWT_AUTH_ENABLED=true and configure FLAGENT_JWT_AUTH_SECRET (min 32 chars)."}""",
@@ -268,6 +269,7 @@ fun Application.module() {
268269
}
269270

270271
configureAnalyticsEventsRoutes(services.analyticsEventsService)
272+
configureAnalyticsFunnelRoutes(services.funnelAnalyticsService)
271273

272274
// Tenant, billing, SSO, AI rollouts: registered by enterprise when present
273275
enterpriseConfigurator.configureRoutes(this, backendContext)
@@ -285,46 +287,6 @@ fun Application.module() {
285287
)
286288
}
287289

288-
// Catch-all for unmatched /api paths: return 404 JSON instead of falling through to staticFiles (index.html)
289-
route("/api") {
290-
route("{...}") {
291-
get {
292-
call.respondText(
293-
"""{"error":"Not found"}""",
294-
ContentType.Application.Json,
295-
HttpStatusCode.NotFound
296-
)
297-
}
298-
post {
299-
call.respondText(
300-
"""{"error":"Not found"}""",
301-
ContentType.Application.Json,
302-
HttpStatusCode.NotFound
303-
)
304-
}
305-
put {
306-
call.respondText(
307-
"""{"error":"Not found"}""",
308-
ContentType.Application.Json,
309-
HttpStatusCode.NotFound
310-
)
311-
}
312-
delete {
313-
call.respondText(
314-
"""{"error":"Not found"}""",
315-
ContentType.Application.Json,
316-
HttpStatusCode.NotFound
317-
)
318-
}
319-
patch {
320-
call.respondText(
321-
"""{"error":"Not found"}""",
322-
ContentType.Application.Json,
323-
HttpStatusCode.NotFound
324-
)
325-
}
326-
}
327-
}
328290
}
329291

330292
// Apply WebPrefix if configured

backend/src/main/kotlin/flagent/application/ApplicationSetup.kt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ import flagent.service.UserService
2929
import flagent.service.ConstraintService
3030
import flagent.service.CrashReportService
3131
import flagent.service.CoreMetricsService
32+
import flagent.service.FunnelAnalyticsService
3233
import flagent.service.DistributionService
3334
import flagent.service.EvaluationService
3435
import flagent.service.ExportService
@@ -89,6 +90,7 @@ data class AppServices(
8990
val exportService: ExportService,
9091
val importService: ImportService,
9192
val analyticsEventsService: AnalyticsEventsService,
93+
val funnelAnalyticsService: FunnelAnalyticsService,
9294
val crashReportService: CrashReportService,
9395
val coreMetricsService: CoreMetricsService?
9496
)
@@ -236,6 +238,7 @@ fun createServices(
236238
repos.flagRepository
237239
)
238240
val analyticsEventsService = AnalyticsEventsService(repos.analyticsEventRepository)
241+
val funnelAnalyticsService = FunnelAnalyticsService(repos.analyticsEventRepository)
239242
val crashReportService = CrashReportService(repos.crashReportRepository)
240243

241244
return AppServices(
@@ -253,6 +256,7 @@ fun createServices(
253256
exportService,
254257
importService,
255258
analyticsEventsService,
259+
funnelAnalyticsService,
256260
crashReportService,
257261
recordingAndMetrics.coreMetricsService
258262
)

backend/src/main/kotlin/flagent/domain/entity/CrashReport.kt

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,9 @@
11
package flagent.domain.entity
22

3-
import kotlinx.serialization.Serializable
4-
53
/**
64
* Crash report from SDK (Firebase Crashlytics-level).
75
* OSS entity; Enterprise uses same structure with tenant isolation.
86
*/
9-
@Serializable
107
data class CrashReport(
118
val id: Long = 0,
129
val stackTrace: String,

backend/src/main/kotlin/flagent/domain/entity/Webhook.kt

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,8 @@
11
package flagent.domain.entity
22

3-
import kotlinx.serialization.Serializable
4-
53
/**
64
* Webhook - configuration for outgoing webhook notifications.
75
*/
8-
@Serializable
96
data class Webhook(
107
val id: Int = 0,
118
val url: String,

0 commit comments

Comments
 (0)