├── docs ├── .nojekyll ├── CNAME ├── .DS_Store ├── public │ └── .DS_Store ├── src │ ├── env.d.ts │ ├── assets │ │ └── ascend-logo.png │ ├── content │ │ └── docs │ │ │ ├── howto │ │ │ ├── assets │ │ │ │ ├── upload-csv.png │ │ │ │ ├── create-audience.png │ │ │ │ ├── variant-config.png │ │ │ │ ├── experiment-targeting.png │ │ │ │ └── create-first-experiment.png │ │ │ ├── create-first-experiment.mdx │ │ │ └── how-to-contribute.mdx │ │ │ ├── sdks │ │ │ ├── kotlin │ │ │ │ ├── installation.mdx │ │ │ │ ├── quick-start.mdx │ │ │ │ └── api.mdx │ │ │ ├── react-native │ │ │ │ ├── installation.mdx │ │ │ │ ├── quick-start.mdx │ │ │ │ └── api.mdx │ │ │ └── ios │ │ │ │ ├── installation.mdx │ │ │ │ ├── quick-start.mdx │ │ │ │ └── api.mdx │ │ │ ├── introduction │ │ │ ├── overview.mdx │ │ │ ├── getting-started.mdx │ │ │ └── why-use-ascend.mdx │ │ │ └── concepts │ │ │ └── overview.mdx │ ├── content.config.ts │ ├── pages │ │ └── index.astro │ └── styles │ │ ├── command-flag-table.css │ │ └── custom.css ├── assets │ └── ascend-logo.png ├── tsconfig.json ├── package.json ├── astro.config.mjs └── README.md ├── .gitignore ├── .github └── workflows │ └── deploy-gh-pages.yml ├── LICENSE ├── README.md ├── remove.sh └── startup.sh /docs/.nojekyll: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /docs/CNAME: -------------------------------------------------------------------------------- 1 | ascend.dreamhorizon.org -------------------------------------------------------------------------------- /docs/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dream-horizon-org/ascend/HEAD/docs/.DS_Store -------------------------------------------------------------------------------- /docs/public/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dream-horizon-org/ascend/HEAD/docs/public/.DS_Store -------------------------------------------------------------------------------- /docs/src/env.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | /// 3 | -------------------------------------------------------------------------------- /docs/assets/ascend-logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dream-horizon-org/ascend/HEAD/docs/assets/ascend-logo.png -------------------------------------------------------------------------------- /docs/src/assets/ascend-logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dream-horizon-org/ascend/HEAD/docs/src/assets/ascend-logo.png -------------------------------------------------------------------------------- /docs/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "astro/tsconfigs/strict", 3 | "compilerOptions": { 4 | "baseUrl": "ascend.dreamhorizon.org" 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /docs/src/content/docs/howto/assets/upload-csv.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dream-horizon-org/ascend/HEAD/docs/src/content/docs/howto/assets/upload-csv.png -------------------------------------------------------------------------------- /docs/src/content/docs/howto/assets/create-audience.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dream-horizon-org/ascend/HEAD/docs/src/content/docs/howto/assets/create-audience.png -------------------------------------------------------------------------------- /docs/src/content/docs/howto/assets/variant-config.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dream-horizon-org/ascend/HEAD/docs/src/content/docs/howto/assets/variant-config.png -------------------------------------------------------------------------------- /docs/src/content/docs/howto/assets/experiment-targeting.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dream-horizon-org/ascend/HEAD/docs/src/content/docs/howto/assets/experiment-targeting.png -------------------------------------------------------------------------------- /docs/src/content/docs/howto/assets/create-first-experiment.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dream-horizon-org/ascend/HEAD/docs/src/content/docs/howto/assets/create-first-experiment.png -------------------------------------------------------------------------------- /docs/src/content.config.ts: -------------------------------------------------------------------------------- 1 | import { defineCollection } from "astro:content"; 2 | import { docsSchema } from "@astrojs/starlight/schema"; 3 | 4 | export const collections = { 5 | docs: defineCollection({ schema: docsSchema() }), 6 | }; 7 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | **/.astro/* 2 | **/.vscode/* 3 | **/.idea/* 4 | **/.env* 5 | 6 | # dependencies 7 | **/node_modules/* 8 | **/dist/* 9 | **/build/* 10 | **/target/* 11 | 12 | # logs 13 | **/out/* 14 | **/logs/* 15 | 16 | # temp 17 | **/tmp/* 18 | **/temp/* 19 | -------------------------------------------------------------------------------- /docs/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "ascend-docs", 3 | "private": true, 4 | "type": "module", 5 | "version": "1.0.0", 6 | "description": "Documentation for Ascend - Experimentation Platform", 7 | "scripts": { 8 | "dev": "astro dev", 9 | "build": "astro build", 10 | "preview": "astro preview" 11 | }, 12 | "dependencies": { 13 | "@astrojs/mdx": "^4.3.7", 14 | "@astrojs/starlight": "^0.36.1", 15 | "astro": "^5.14.8", 16 | "sharp": "^0.34.4" 17 | }, 18 | "devDependencies": { 19 | "typescript": "^5.5.4" 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /docs/src/content/docs/howto/create-first-experiment.mdx: -------------------------------------------------------------------------------- 1 | --- 2 | title: Create Your First Experiment 3 | description: This guide walks you through creating your first experiment with Ascend, from installation to verification and SDK configuration. 4 | --- 5 | 6 | 1. Create audience 7 | 8 | ![create audience](./assets/create-audience.png) 9 | 10 | ![upload csv](./assets/upload-csv.png) 11 | 12 | 2. Create experiment 13 | 14 | ![create first experiment](./assets/create-first-experiment.png) 15 | 16 | ![experiment targeting](./assets/experiment-targeting.png) 17 | 18 | ![variant config](./assets/variant-config.png) 19 | -------------------------------------------------------------------------------- /.github/workflows/deploy-gh-pages.yml: -------------------------------------------------------------------------------- 1 | name: Deploy to GitHub Pages 2 | 3 | on: 4 | push: 5 | branches: [main] 6 | paths: 7 | - 'docs/**' 8 | workflow_dispatch: 9 | 10 | concurrency: 11 | group: ${{ github.workflow }}-${{ github.ref }} 12 | cancel-in-progress: true 13 | 14 | permissions: 15 | contents: read 16 | pages: write 17 | id-token: write 18 | 19 | jobs: 20 | build: 21 | runs-on: ubuntu-latest 22 | steps: 23 | - name: Checkout your repository using git 24 | uses: actions/checkout@v4 25 | 26 | - name: Install, build, and upload your site 27 | uses: withastro/action@v3 28 | with: 29 | path: docs 30 | node-version: 20 31 | package-manager: npm 32 | 33 | deploy: 34 | needs: build 35 | runs-on: ubuntu-latest 36 | environment: 37 | name: github-pages 38 | url: ${{ steps.deployment.outputs.page_url }} 39 | steps: 40 | - name: Deploy to GitHub Pages 41 | id: deployment 42 | uses: actions/deploy-pages@v4 -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2025 Sporta Technologies PVT LTD 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. 22 | -------------------------------------------------------------------------------- /docs/src/content/docs/sdks/kotlin/installation.mdx: -------------------------------------------------------------------------------- 1 | --- 2 | title: Installation 3 | description: Installation Guide 4 | --- 5 | 6 | ## Prerequisites 7 | 8 | Before integrating the Ascend Android SDK, ensure your project meets the following requirements: 9 | 10 | - **Android API Level**: Minimum SDK 24 (Android 7.0) 11 | - **Target SDK**: 36 (Android 14) 12 | - **Java Version**: 11 or higher 13 | - **Kotlin**: 2.0.21 or higher 14 | - **Android Gradle Plugin**: 8.13.0 or higher 15 | 16 | --- 17 | 18 | ## Gradle Setup 19 | 20 | ### 1. Add Repository 21 | 22 | Add Maven Central to your project's `settings.gradle.kts` (usually already included by default): 23 | 24 | ```kotlin 25 | dependencyResolutionManagement { 26 | repositories { 27 | google() 28 | mavenCentral() // Maven Central is usually included by default 29 | } 30 | } 31 | ``` 32 | 33 | --- 34 | 35 | ### 2. Add Dependency 36 | 37 | Add the SDK dependency to your app module's `build.gradle.kts`: 38 | ref: [mavenCentral](https://central.sonatype.com/artifact/org.dreamhorizon/ascend-android-sdk/overview) 39 | 40 | ```kotlin 41 | dependencies { 42 | implementation("org.dreamhorizon:ascend-android-sdk:x.y.z") /* replace x.y.z with latest version */ 43 | } 44 | ``` -------------------------------------------------------------------------------- /docs/src/content/docs/sdks/react-native/installation.mdx: -------------------------------------------------------------------------------- 1 | --- 2 | title: Installation 3 | description: Installation Guide 4 | --- 5 | 6 | ## Prerequisites 7 | 8 | Before integrating the Ascend React Native SDK, ensure your project meets the following requirements: 9 | 10 | - **React Native**: 0.60.0 or higher 11 | - **Node.js**: 14.0.0 or higher 12 | - **TypeScript**: 4.0.0 or higher (recommended) 13 | - **iOS**: iOS 11.0 or higher 14 | - **Android**: API Level 21 (Android 5.0) or higher 15 | 16 | --- 17 | 18 | ## Package Installation 19 | 20 | ### Using Yarn 21 | 22 | ```shell 23 | yarn add @d11/ascend-react-native@latest // core 24 | yarn add @d11/ascend-experiments-react-native@latest // experiments plugin 25 | ``` 26 | 27 | ### Using NPM 28 | 29 | ```shell 30 | npm install @d11/ascend-react-native@latest // core 31 | npm install @d11/ascend-experiments-react-native@latest // experiments plugin 32 | ``` 33 | 34 | --- 35 | 36 | ## Platform Setup 37 | 38 | ### iOS Setup 39 | 40 | No additional setup required for iOS. The SDK will work out of the box. 41 | 42 | ### Android Setup 43 | 44 | No additional setup required for Android. The SDK will work out of the box. 45 | 46 | --- 47 | 48 | ## TypeScript Support 49 | 50 | The SDK includes full TypeScript definitions. If you're using TypeScript, you'll get full type safety and IntelliSense support. -------------------------------------------------------------------------------- /docs/src/pages/index.astro: -------------------------------------------------------------------------------- 1 | --- 2 | import StarlightPage from "@astrojs/starlight/components/StarlightPage.astro"; 3 | import { Card, CardGrid } from "@astrojs/starlight/components"; 4 | import logo from "../assets/ascend-logo.png"; 5 | --- 6 | 7 | 34 | 35 | 36 | Built on vertx for high performance. 37 | 38 | 39 | Rule based targeting with support of conditional logic. 40 | 41 | 42 | Multiple assignment strategies. 43 | 44 | 45 | Native SDKs quick integration. 46 | 47 | 48 | 49 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # ASCEND 2 | 3 | Production-ready Experimentation platform for your product growth. 4 | 5 | --- 6 | 7 | ## What is Ascend? 8 | 9 | An open source experimentation platform to enable individuals or companies to test features and measure impact in an easy and customizable fashion faster, safer, and more consistent. 10 | 11 | ### Architecture : 12 | ASCEND_ARCH 13 | 14 | --- 15 | 16 | ## Core Concepts 17 | 18 | Learn about the fundamental concepts and architecture of Ascend in our [documentation](https://ascend.dreamhorizon.org/). 19 | 20 | --- 21 | 22 | ## Installation 23 | 24 | Ready to get started? Follow our comprehensive installation guide in our [Getting Started Guide](https://ascend.dreamhorizon.org/introduction/getting-started/). 25 | 26 | --- 27 | 28 | ## 📚 References and links 29 | 30 | ### Official Resources 31 | 32 | #### Repositories 33 | 34 | - [Ascend](https://github.com/dream-horizon-org/ascend) - Main repository with docs and installation scripts 35 | - [testlab Experiment Backend](https://github.com/dream-horizon-org/testlab) - Backend experiment server 36 | - [flockr Audience Backend](https://github.com/dream-horizon-org/flockr) - Audience management server 37 | - [ascend-panel](https://github.com/dream-horizon-org/ascend-panel) - Admin panel 38 | - [ascend-android-sdk](https://github.com/dream-horizon-org/ascend-android) - Android SDK 39 | - [ascend-ios-sdk](https://github.com/dream-horizon-org/ascend-ios) - IOS SDK 40 | 41 | #### License 42 | 43 | [MIT License](./LICENSE) 44 | 45 | --- 46 | -------------------------------------------------------------------------------- /docs/src/content/docs/sdks/kotlin/quick-start.mdx: -------------------------------------------------------------------------------- 1 | --- 2 | title: Quick Start 3 | description: Quick Start for Android SDK Integration 4 | --- 5 | 6 | Get started with the Ascend Android SDK in just a few steps. 7 | 8 | --- 9 | 10 | ## Initialize the SDK 11 | 12 | ```kotlin 13 | import android.app.Application 14 | import android.util.Log 15 | import com.application.ascend_android.* 16 | import com.google.gson.JsonObject 17 | 18 | class MyApplication : Application() { 19 | override fun onCreate() { 20 | super.onCreate() 21 | 22 | val httpConfig = HttpConfig( 23 | apiBaseUrl = "http://localhost:8100", // Replace with your actual API endpoint 24 | ) 25 | 26 | val experimentConfig = ExperimentConfig.Builder(object : IExperimentCallback { 27 | override fun onSuccess() { 28 | // Called when experiments are successfully fetched 29 | } 30 | override fun onFailure(throwable: Throwable) { 31 | // Called when experiment fetch fails 32 | } 33 | }) 34 | .defaultValues(hashMapOf("button_color" to JsonObject().apply { addProperty("color", "blue") })) 35 | .shouldFetchOnInit(true) // Fetch experiments immediately on initialization 36 | .httpConfig(httpConfig) 37 | .build() 38 | 39 | val experimentPluginConfig = PluginConfig(::DRSPlugin, Plugins.EXPERIMENTS.pluginName, experimentConfig) 40 | 41 | val ascendConfig = AscendConfig(httpConfig, arrayListOf(experimentPluginConfig), ClientConfig("your-key")) // Replace with your actual API key 42 | 43 | Ascend.init(ascendConfig, this) 44 | 45 | Ascend.user.setUser("user123") // Replace with your actual user ID 46 | } 47 | } 48 | ``` 49 | 50 | --- 51 | 52 | ## Use Experiments 53 | 54 | ```kotlin 55 | val experimentPlugin = Ascend.getPlugin(Plugins.EXPERIMENTS) 56 | 57 | val buttonColor = experimentPlugin.getExperimentService() 58 | .getStringFlag("button_color", "color") 59 | 60 | button.setBackgroundColor(Color.parseColor(buttonColor)) 61 | ``` 62 | 63 | --- 64 | 65 | ## Use Events 66 | 67 | Coming soon... -------------------------------------------------------------------------------- /docs/src/styles/command-flag-table.css: -------------------------------------------------------------------------------- 1 | /* Scoped styles for the command flags tables across CLI docs */ 2 | .cli-flags-table table { 3 | width: 100%; 4 | border-collapse: separate; 5 | border-spacing: 0; 6 | margin: 2rem 0; 7 | font-size: 0.95rem; 8 | box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1); 9 | border-radius: 8px; 10 | overflow: hidden; /* ensures header color fills to rounded edges */ 11 | table-layout: auto; 12 | line-height: 1.6; 13 | } 14 | 15 | .cli-flags-table thead, 16 | .cli-flags-table thead tr { 17 | background: var(--sl-color-accent); 18 | } 19 | 20 | .cli-flags-table thead th { 21 | padding: 1.5rem 2rem; 22 | text-align: left; 23 | border: none; 24 | color: #ffffff !important; 25 | font-weight: 600; 26 | text-transform: uppercase; 27 | font-size: 0.85rem; 28 | letter-spacing: 0.05em; 29 | line-height: 1.6; 30 | } 31 | 32 | .cli-flags-table tbody tr { 33 | border-bottom: 1px solid var(--sl-color-gray-6); 34 | transition: background-color 0.2s ease; 35 | min-height: 4rem; 36 | } 37 | 38 | .cli-flags-table tbody tr:hover { 39 | background-color: var(--sl-color-gray-7); 40 | } 41 | 42 | .cli-flags-table tbody tr:last-child { 43 | border-bottom: none; 44 | } 45 | 46 | .cli-flags-table tbody td { 47 | padding: 1.5rem 2rem; 48 | border: none; 49 | word-wrap: break-word; 50 | overflow-wrap: break-word; 51 | vertical-align: middle; 52 | line-height: 1.8; 53 | } 54 | 55 | .cli-flags-table tbody td:first-child { 56 | font-weight: 500; 57 | color: var(--sl-color-accent-high); 58 | } 59 | 60 | .cli-flags-table tbody td code { 61 | background: var(--sl-color-gray-6); 62 | padding: 0.2rem 0.4rem; 63 | border-radius: 4px; 64 | font-size: 0.85em; 65 | white-space: normal; /* allow wrapping inside code to avoid column growth */ 66 | word-break: break-word; 67 | } 68 | 69 | /* Equal-width helpers for markdown tables wrapped with cli-flags-table */ 70 | .cli-flags-table.equal-5 thead th, 71 | .cli-flags-table.equal-5 tbody td { 72 | width: 20% !important; 73 | } 74 | 75 | .cli-flags-table.equal-4 thead th, 76 | .cli-flags-table.equal-4 tbody td { 77 | width: 25% !important; 78 | } 79 | 80 | @media (max-width: 768px) { 81 | .cli-flags-table table { 82 | font-size: 0.85rem; 83 | } 84 | 85 | .cli-flags-table thead th, 86 | .cli-flags-table tbody td { 87 | padding: 1.25rem 1.5rem; 88 | } 89 | } 90 | -------------------------------------------------------------------------------- /docs/src/content/docs/sdks/ios/installation.mdx: -------------------------------------------------------------------------------- 1 | --- 2 | title: Installation 3 | description: Installation Guide 4 | --- 5 | 6 | ## Prerequisites 7 | 8 | Before integrating the Ascend iOS SDK, ensure your project meets the following requirements: 9 | 10 | - **iOS Version**: Minimum iOS 13.0 11 | - **Swift Version**: 5.0 or higher 12 | - **Xcode**: 12.0 or higher 13 | - **Deployment Target**: iOS 13.0 or later 14 | 15 | --- 16 | 17 | ## Swift Package Manager 18 | 19 | ### 1. Add Package Dependency 20 | 21 | In Xcode: 22 | 23 | 1. Go to **File > Add Packages…** 24 | 2. Enter the package repository URL: 25 | ``` 26 | https://github.com/dream-horizon-org/ascend-ios 27 | ``` 28 | 3. Select the **Ascend** package 29 | 4. Choose the version you want to use (preferably use a specific tag like `1.0.0`) 30 | 5. Click **Add Package** 31 | 32 | Alternatively, add the dependency directly in your `Package.swift`: 33 | 34 | ```swift 35 | dependencies: [ 36 | .package(url: "https://github.com/dream-horizon-org/ascend-ios", from: "1.0.0") 37 | ] 38 | ``` 39 | 40 | --- 41 | 42 | ## CocoaPods 43 | 44 | ### 1. Add to Podfile 45 | 46 | Add the following to your `Podfile`: 47 | 48 | ```ruby 49 | platform :ios, '11.0' 50 | 51 | target 'YourApp' do 52 | use_frameworks! 53 | 54 | pod 'Ascend', :git => 'https://github.com/dream-horizon-org/ascend-ios.git', :tag => '1.0.0' 55 | end 56 | ``` 57 | 58 | ### 2. Install Dependencies 59 | 60 | Run the following command in your terminal: 61 | 62 | ```bash 63 | pod install 64 | ``` 65 | 66 | --- 67 | 68 | ## Manual Installation 69 | 70 | 1. Clone the repository: 71 | ```bash 72 | git clone https://github.com/dream-horizon-org/ascend-ios.git 73 | ``` 74 | 75 | 2. Drag the `Sources` folder into your Xcode project 76 | 77 | 3. Make sure to add the following frameworks to your project: 78 | - Foundation 79 | - UIKit 80 | - SystemConfiguration 81 | - CoreLocation 82 | 83 | --- 84 | 85 | ## Import Statements 86 | 87 | After installation, import the SDK in your Swift files: 88 | 89 | ```swift 90 | import Ascend 91 | ``` 92 | 93 | --- 94 | 95 | ## Verify Installation 96 | 97 | After installation, verify that you can import the SDK: 98 | 99 | ```swift 100 | import Ascend 101 | ``` 102 | 103 | If the import succeeds, the SDK is properly installed. 104 | 105 | -------------------------------------------------------------------------------- /docs/astro.config.mjs: -------------------------------------------------------------------------------- 1 | import { defineConfig } from 'astro/config'; 2 | import starlight from '@astrojs/starlight'; 3 | 4 | // https://astro.build/config 5 | export default defineConfig({ 6 | site: 'https://ascend.dreamhorizon.org', 7 | base: '/', 8 | integrations: [ 9 | starlight({ 10 | title: 'Ascend', 11 | description: 'Ascend - Product Growth Experimentation & Targeting Platform', 12 | favicon: '/ascend-logo.png', 13 | logo: { 14 | src: './src/assets/ascend-logo.png', 15 | }, 16 | social: [ 17 | { 18 | icon: 'github', 19 | label: 'GitHub', 20 | href: 'https://github.com/dream-horizon-org/ascend', 21 | }, 22 | ], 23 | sidebar: [ 24 | { 25 | label: 'Introduction', 26 | items: [ 27 | 'introduction/overview', 28 | 'introduction/getting-started', 29 | 'introduction/why-use-ascend', 30 | ], 31 | }, 32 | { 33 | label: 'Key Concepts', 34 | items: [ 35 | 'concepts/overview' 36 | ], 37 | }, 38 | { 39 | label: 'SDKs', 40 | items: [ 41 | { 42 | label: 'Android', 43 | items: [ 44 | 'sdks/kotlin/installation', 45 | 'sdks/kotlin/quick-start', 46 | 'sdks/kotlin/api' 47 | 48 | 49 | ], 50 | }, 51 | { 52 | label: 'iOS', 53 | items: [ 54 | 'sdks/ios/installation', 55 | 'sdks/ios/quick-start', 56 | 'sdks/ios/api' 57 | 58 | ], 59 | }, 60 | { 61 | label: 'React Native', 62 | items: [ 63 | 'sdks/react-native/installation', 64 | 'sdks/react-native/quick-start', 65 | 'sdks/react-native/api' 66 | 67 | ], 68 | }, 69 | 70 | ], 71 | }, 72 | { 73 | label: 'How-To Guides', 74 | items: [ 75 | 'howto/how-to-contribute', 76 | 'howto/create-first-experiment' 77 | ], 78 | }, 79 | ], 80 | customCss: ['./src/styles/custom.css'], 81 | tableOfContents: { 82 | minHeadingLevel: 2, 83 | maxHeadingLevel: 4, 84 | }, 85 | pagination: true, 86 | }), 87 | ], 88 | server: { 89 | port: 4321, 90 | host: true, 91 | }, 92 | }); 93 | -------------------------------------------------------------------------------- /docs/src/content/docs/introduction/overview.mdx: -------------------------------------------------------------------------------- 1 | --- 2 | title: Overview 3 | description: Ascend - Experimentation Platform for Product Growth 4 | --- 5 | 6 | ## What is Ascend? 7 | 8 | **Ascend** is an open-source A/B testing Experimentation platform that empowers teams to make data-driven decisions through controlled experiments. It provides a complete solution for running experiments across different mobile applications with minimal integration effort. 9 | 10 | It also provides support to create and manage audience(cohorts) using static(ID-based) . 11 | 12 | 13 | :::tip 14 | 15 | - Got questions? 16 | - We would love to help you get started with Ascend. You can [join us on Discord](https://discord.gg/Mh5BdzGQ) . 17 | ::: 18 | 19 | ## Quick Links 20 | 21 |
22 | 23 | 24 |
⚙️
25 |
26 |

How it works

27 |

Learn about what Ascend does and how it works

28 |
29 |
30 | 31 | 32 |
33 |
34 |

Quick Start

35 |

Get Ascend running in 10 minutes

36 |
37 |
38 | 39 |
40 | 41 | --- 42 | 43 | ## Key Features 44 | 45 | 🚀 **High Performance**: Built on Vert.x for reactive, non-blocking operations, Aerospike integration for ultra-fast allocation. 46 | 47 | 🎯 **Advanced Targeting**: Rule-based targeting with custom attributes, Support for complex conditional logic. 48 | 49 | 📊 **Flexible Assignment**: Random and round-robin distribution strategies, Custom variant weights per cohort. 50 | 51 | 🔌 **Easy Integration**: Ascend SDKs with type-safe APIs, Automatic caching and retry logic. 52 | 53 | 🛡️ **Production-Ready**: Docker and Docker Compose support, Configurable circuit breakers and rate limiting. 54 | 55 | --- 56 | 57 | ## Use Cases 58 | 59 | #### 1) Full Experimentation Platform 60 | 61 | Run comprehensive A/B tests and multivariate experiments to validate features and measure product impact. 62 | 63 | #### 2) Audience Creation 64 | 65 | Create and manage targeted audience segments for precise experiment allocation and feature rollouts. 66 | 67 | #### 3) Experiment Analysis (Coming soon) 68 | 69 | Analyze experiment results with statistical significance testing and detailed metrics. 70 | 71 | --- 72 | 73 | 74 | 75 | 76 | -------------------------------------------------------------------------------- /docs/README.md: -------------------------------------------------------------------------------- 1 | # Ascend Documentation 2 | 3 | This directory contains the Astro-based documentation site for Ascend Platform. 4 | 5 | --- 6 | 7 | ## 🚀 Quick Start 8 | 9 | ### Development 10 | 11 | ```bash 12 | npm install 13 | npm run dev 14 | ``` 15 | 16 | The site will be available at `http://localhost:4321/` 17 | 18 | ### Build 19 | 20 | ```bash 21 | npm run build 22 | ``` 23 | 24 | The built site will be in the `dist/` directory. 25 | 26 | --- 27 | 28 | ### Preview Build 29 | 30 | ```bash 31 | npm run preview 32 | ``` 33 | 34 | --- 35 | 36 | ## 📝 Documentation Structure 37 | 38 | ### GitHub Pages Setup 39 | - **Site URL**: `https://ascend.dreamhorizon.org/` 40 | - **Base Path**: `/` 41 | - **Repository**: `https://dream-horizon-org.github.io/ascend` 42 | 43 | ### Documentation Sections 44 | 45 | The documentation includes: 46 | 47 | 1. **Introduction** 48 | - Overview: What is Ascend and key features 49 | - Getting Started: Installation and create your first experiment 50 | 51 | 2. **Key Concepts** 52 | - Overview: Introduction to core concepts 53 | - Assignment Strategies 54 | - Experiment Lifecycle 55 | - Architecture Overview 56 | - Use cases 57 | 58 | 3. **How-To Guides** 59 | - Deploy Your First Service 60 | - Dev to QA Iteration 61 | - Additional guides for common tasks 62 | 63 | --- 64 | 65 | ## 🎨 Customization 66 | 67 | ### Logo 68 | The site uses Ascend logo from `src/assets/ascend-logo.png` 69 | 70 | ### Theme 71 | Custom styles can be modified in `src/styles/custom.css` 72 | 73 | --- 74 | 75 | ## 📦 Dependencies 76 | 77 | The site uses: 78 | - Astro with Starlight theme 79 | - Node.js and npm 80 | - TypeScript 81 | 82 | --- 83 | 84 | ## 🚀 Deployment 85 | 86 | This site is configured for GitHub Pages deployment: 87 | 1. GitHub Pages enabled in repository settings 88 | 2. Build workflow deploys to the `gh-pages` branch 89 | 3. Site published from the `gh-pages` branch 90 | 91 | The site will be accessible at: `https://ascend.dreamhorizon.org/` 92 | 93 | --- 94 | 95 | ## 📚 Content Guidelines 96 | 97 | When adding new documentation: 98 | 99 | 1. **Use MDX format** for all content files 100 | 2. **Include frontmatter** with title and description 101 | 3. **Add to sidebar** in `astro.config.mjs` 102 | 4. **Use code examples** liberally 103 | 5. **Link between pages** using relative paths 104 | 6. **Follow the existing structure**: 105 | - Concepts: Explain what something is 106 | - How-To: Step-by-step instructions 107 | - Reference: Complete technical details 108 | 109 | --- 110 | 111 | ## 📚 Additional Resources 112 | 113 | - [Astro Documentation](https://astro.build/) 114 | - [Starlight Documentation](https://starlight.astro.build/) 115 | - [Testlab Experiment Backend]() 116 | - [Flockr Audience Backend]() 117 | - [Licence] MIT License 118 | 119 | -------------------------------------------------------------------------------- /docs/src/content/docs/sdks/ios/quick-start.mdx: -------------------------------------------------------------------------------- 1 | --- 2 | title: Quick Start 3 | description: Quick Start for iOS SDK Integration 4 | --- 5 | 6 | Get started with the Ascend iOS SDK in just a few steps. 7 | 8 | --- 9 | 10 | ## Initialize the SDK 11 | 12 | ```swift 13 | import SwiftUI 14 | import Ascend 15 | 16 | @main 17 | struct MyApp: App { 18 | init() { 19 | setupAscendSDK() 20 | } 21 | 22 | var body: some Scene { 23 | WindowGroup { 24 | ContentView() 25 | } 26 | } 27 | 28 | private func setupAscendSDK() { 29 | // 1. Configure Core Settings 30 | let coreConfig = AscendCoreConfig( 31 | apiKey: "your-api-key", 32 | environment: "development", 33 | enableDebugLogging: true 34 | ) 35 | 36 | // 2. Configure HTTP Settings 37 | let httpConfig = HTTPConfig( 38 | apiBaseUrl: "https://api.ascend.com", 39 | timeout: 30.0, 40 | shouldRetry: true, 41 | maxRetries: 3, 42 | defaultHeaders: ["api-key": "your-api-key"] 43 | ) 44 | 45 | // 3. Configure Experiments Plugin 46 | let experimentsConfig = AscendExperimentsConfiguration.development( 47 | apiBaseUrl: "https://api.ascend.com", 48 | apiEndpoint: "/v1/allocations", 49 | defaultValues: [ 50 | "button_color": .dictionary([ 51 | "color": .string("blue") 52 | ]) 53 | ], 54 | headers: ["api-key": "your-api-key"] 55 | ) 56 | 57 | // 4. Create SDK Configuration 58 | let config = AscendConfig( 59 | plugins: [AscendPlugin(type: .experiments, config: experimentsConfig)], 60 | httpConfig: httpConfig, 61 | coreConfig: coreConfig 62 | ) 63 | 64 | // 5. Initialize the SDK 65 | do { 66 | try Ascend.initialize(with: config) 67 | print("✅ Ascend SDK initialized successfully") 68 | 69 | // Set a user (required for experiments) 70 | Ascend.user.setUser(userId: "user-123") 71 | } catch { 72 | print("❌ Failed to initialize Ascend SDK: \(error)") 73 | } 74 | } 75 | } 76 | ``` 77 | 78 | --- 79 | 80 | ## Use Experiments 81 | 82 | ```swift 83 | // Get the experiments plugin 84 | let experiments = try Ascend.getPlugin(AscendExperiments.self) 85 | 86 | // Get string value 87 | let buttonColor = experiments.getStringValue(for: "button_color", with: "color") 88 | print("Button color: \(buttonColor)") 89 | 90 | // Get boolean value 91 | let isEnabled = experiments.getBoolValue(for: "feature_toggle", with: "enabled") 92 | print("Feature enabled: \(isEnabled)") 93 | 94 | // Get integer value 95 | let maxRetries = experiments.getIntValue(for: "retry_config", with: "max_attempts") 96 | print("Max retries: \(maxRetries)") 97 | ``` 98 | 99 | --- 100 | 101 | ## Fetch Experiments from API 102 | 103 | ```swift 104 | let experiments = try Ascend.getPlugin(AscendExperiments.self) 105 | 106 | experiments.fetchExperiments(for: [ 107 | "button_color": .dictionary([ 108 | "color": .string("blue") 109 | ]) 110 | ]) { response, error in 111 | if let error = error { 112 | print("Error: \(error)") 113 | } else if let response = response { 114 | print("Fetched \(response.data?.count ?? 0) experiments") 115 | } 116 | } 117 | ``` 118 | 119 | --- 120 | 121 | ## Use Events 122 | 123 | Coming soon... 124 | 125 | -------------------------------------------------------------------------------- /docs/src/content/docs/introduction/getting-started.mdx: -------------------------------------------------------------------------------- 1 | --- 2 | title: Getting Started 3 | description: Install Ascend platform in under 10 minutes 4 | --- 5 | 6 | Get up and running with Ascend on a docker. This guide will walk you through installation, configuration, and creating your first experiment. 7 | 8 | --- 9 | 10 | ## Prerequisites 11 | 12 | --- 13 | 14 | ### Hardware Requirements 15 | | Resource | Minimum | 16 | |----------|---------| 17 | | RAM | 8 GB | 18 | | CPU| 4 cores | 19 | | Disk Space | 20 GB free | 20 | | OS | macOS 11+, Linux (Ubuntu 20.04+) | 21 | 22 | 23 | ### Software Requirements 24 | 25 | The following tools must be installed on your system: 26 | 27 | | Tool | Minimum Version | Installation | 28 | |------|----------------|--------------| 29 | | Docker | v20.10+ | [Install Guide](https://docs.docker.com/get-docker/) | 30 | | curl | v7.68+ | Pre-installed on most systems | 31 | 32 | :::note 33 | The installation script will automatically check for these prerequisites and guide you through installing any missing tools. 34 | ::: 35 | 36 | --- 37 | 38 | ## Quick Start: One-Command Installation 39 | 40 | Get Ascend running on a docker in under 10 minutes: 41 | 42 | ```bash 43 | bash <(curl -fsSL https://raw.githubusercontent.com/dream-horizon-org/ascend/main/startup.sh) 44 | ``` 45 | 46 | ### What This Does 47 | 48 | The installation script automatically: 49 | 50 | 1. ✅ Checks and installs prerequisites (Docker etc.) 51 | 2. ✅ Clones the Ascend repository 52 | 3. ✅ Deploys Ascend with all components 53 | 4. ✅ Open http://localhost:9000 in browser 54 | 55 | 56 | **Expected Duration**: 7-10 minutes (depending on internet speed and hardware) 57 | 58 | --- 59 | 60 | ### Installation Output 61 | 62 | You'll see output similar to: 63 | 64 | ```bash 65 | # bash startup.sh 66 | 🚀 Installing Ascend platform to /Users/mac-user/.ascend... 67 | 68 | 📦 Installing requirements... 69 | 70 | 📁 Setting up installation directory... 71 | 72 | 📥 Checking out repositories... 73 | 74 | 🐳 Starting dependent services... 75 | Starting services for testlab... 76 | ✅ Started testlab services 77 | Starting services for flockr... 78 | ✅ Started flockr services 79 | Starting services for ascend-panel... 80 | ✅ Started ascend-panel services 81 | 82 | ✅ Ascend platform installed successfully in /Users/mac-user/.ascend 83 | 🌐 Ascend started at http://localhost:9000 84 | 85 | ``` 86 | 87 | Now that Ascend is installed and configured, you can create your first experiment: 88 | 89 | For a complete walkthrough, see: 90 | - [Create Your First Experiment](/howto/create-first-experiment) - Step-by-step tutorial 91 | - [Key Concepts](/concepts/overview) - Understand experiment, assignments, variant, cohorts etc. 92 | 93 | --- 94 | 95 | ### Uninstallation 96 | 97 | To remove Ascend from your cluster: 98 | 99 | ```bash 100 | # using the Uninstallation script 101 | bash <(curl -fsSL https://raw.githubusercontent.com/dream-horizon-org/ascend/main/remove.sh) 102 | ``` 103 | 104 | --- 105 | 106 | ## Next Steps 107 | 108 | :::tip[🎉 Success!] 109 | Congratulations! You've successfully installed Ascend and [create your first experiment](/howto/create-first-experiment). 110 | 111 | **Next steps:** 112 | - [Configure SDK](/sdks/kotlin/installation) - Complete walkthrough 113 | - [Key Concepts](/concepts/overview) - Understand key concepts experiments, audience, assignment etc. 114 | - [How-To Contribute](/howto/how-to-contribute) - How to Contribute to Ascend 115 | ::: 116 | 117 | --- 118 | 119 | ## Additional Resources 120 | 121 | - **GitHub Repository**: https://github.com/dream-horizon-org/ascend 122 | - **Issue Tracker**: https://github.com/dream-horizon-org/ascend/issues 123 | - **License**: [MIT License](https://github.com/dream-horizon-org/ascend/blob/main/LICENSE) 124 | -------------------------------------------------------------------------------- /remove.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | ASCEND_DEFAULT_DIR="${HOME}/.ascend" 4 | 5 | REPO_LIST=("testlab" "flockr" "ascend-panel" "ascend-astra") 6 | 7 | # stop and remove containers 8 | stop_containers () { 9 | local base_dir=$1 10 | local remove_volumes=${2:-true} 11 | 12 | if [ ! -d "$base_dir" ]; then 13 | echo "Directory ${base_dir} does not exist. Skipping container removal." 14 | return 0 15 | fi 16 | 17 | cd "$base_dir" || exit 1 18 | 19 | for repo in "${REPO_LIST[@]}"; do 20 | local repo_dir="${base_dir}/${repo}" 21 | if [ -d "${repo_dir}" ]; then 22 | echo "🛑 Stopping containers for ${repo}..." 23 | cd "${repo_dir}" || continue 24 | if [ "$remove_volumes" = true ]; then 25 | docker compose down -v 2>/dev/null || echo "⚠️ Warning: Failed to stop containers for ${repo}" 26 | else 27 | docker compose down 2>/dev/null || echo "⚠️ Warning: Failed to stop containers for ${repo}" 28 | fi 29 | cd "$base_dir" || exit 1 30 | else 31 | echo "⚠️ Skipping ${repo} - directory does not exist" 32 | fi 33 | done 34 | } 35 | 36 | # prune unused docker resources 37 | prune_docker () { 38 | echo "🧹 Pruning unused Docker resources..." 39 | docker system prune -f 2>/dev/null || echo "⚠️ Warning: Failed to prune Docker resources" 40 | } 41 | 42 | # remove base directory 43 | remove_base_dir () { 44 | local base_dir=$1 45 | 46 | if [ ! -d "$base_dir" ]; then 47 | echo "Directory ${base_dir} does not exist. Nothing to remove." 48 | return 0 49 | fi 50 | 51 | echo "🗑️ Removing ${base_dir}..." 52 | rm -rf "${base_dir}" 53 | } 54 | 55 | # confirm action with user 56 | confirm_removal () { 57 | local base_dir=$1 58 | local containers_only=$2 59 | 60 | if [ "$containers_only" = true ]; then 61 | echo "⚠️ WARNING: This will stop all Ascend containers" 62 | else 63 | echo "⚠️ WARNING: This will remove all Ascend services and data from ${base_dir}" 64 | echo "This action cannot be undone." 65 | fi 66 | read -p "Are you sure you want to continue? (y/N): " -r response 67 | 68 | case "$response" in 69 | [yY][eE][sS]|[yY]) 70 | return 0 71 | ;; 72 | *) 73 | echo "Operation cancelled." 74 | exit 0 75 | ;; 76 | esac 77 | } 78 | 79 | print_usage () { 80 | echo "Usage: $0 [OPTIONS] [BASE_DIR]" 81 | echo "" 82 | echo "Options:" 83 | echo " --stop-only, -s Stop containers only (keep directories and images)" 84 | echo " --yes, -y Skip confirmation prompt" 85 | echo " --help, -h Show this help message" 86 | echo "" 87 | echo "Arguments:" 88 | echo " BASE_DIR Installation directory (default: ${ASCEND_DEFAULT_DIR})" 89 | } 90 | 91 | main () { 92 | local base_dir="${ASCEND_DEFAULT_DIR}" 93 | local skip_confirm=false 94 | local stop_only=false 95 | 96 | # Parse arguments 97 | while [[ $# -gt 0 ]]; do 98 | case "$1" in 99 | --stop-only|-s) 100 | stop_only=true 101 | shift 102 | ;; 103 | --yes|-y) 104 | skip_confirm=true 105 | shift 106 | ;; 107 | --help|-h) 108 | print_usage 109 | exit 0 110 | ;; 111 | *) 112 | base_dir="$1" 113 | shift 114 | ;; 115 | esac 116 | done 117 | 118 | # Confirm with user 119 | if [ "$skip_confirm" = false ]; then 120 | confirm_removal "${base_dir}" "${stop_only}" 121 | fi 122 | 123 | if [ "$stop_only" = true ]; then 124 | echo "🛑 Stopping Ascend services in ${base_dir}..." 125 | echo "" 126 | stop_containers "${base_dir}" false 127 | echo "" 128 | echo "✅ Ascend services stopped successfully." 129 | echo " Directories and images preserved." 130 | else 131 | echo "🗑️ Removing Ascend services from ${base_dir}..." 132 | echo "" 133 | stop_containers "${base_dir}" true 134 | remove_base_dir "${base_dir}" 135 | prune_docker 136 | echo "" 137 | echo "✅ Ascend services removed successfully." 138 | fi 139 | } 140 | 141 | main "$@" 142 | -------------------------------------------------------------------------------- /docs/src/content/docs/sdks/react-native/quick-start.mdx: -------------------------------------------------------------------------------- 1 | --- 2 | title: Quick Start 3 | description: Quick Start for Android SDK Integration 4 | --- 5 | 6 | Get started with the Ascend React Native SDK in just a few steps. 7 | 8 | --- 9 | 10 | ## Initialize the SDK 11 | 12 | 1. Create a file `initAscend.ts` under src folder next to your app's index file. 13 | 2. Import this file to your index file and call the `initAscend` method to initialise Ascend. 14 | 3. Read following section to understand how to import and configure Ascend. 15 | 16 | ### Initialise Ascend 17 | 18 | ```typescript 19 | import Ascend from "@d11/ascend-react-native"; 20 | import AscendExperiments from "@d11/ascend-experiments-react-native"; 21 | 22 | const headers: any = { // put all headers which are required for api.dream11.com 23 | 'Host': 'api.dream11.com', 24 | 'locale': 'en-US', 25 | // Add other required headers 26 | }; 27 | 28 | const httpConfig: THttpConfig = { 29 | headers, 30 | shouldRetry: true, 31 | apiBaseUrl: 'https://api.dream11.com' 32 | }; 33 | 34 | const defaultValues = { 35 | DUMMY_API_PATH_HERE_1: { 36 | value: true, 37 | }, 38 | DUMMY_API_PATH_HERE_2: { 39 | randomBool: false, 40 | randomString: 'random string', 41 | randomInt: -97, 42 | sports: ['cricket', 'football'], 43 | }, 44 | }; 45 | 46 | /* 47 | * ascend-experiments config. 48 | * It should have at least following three attributes 49 | */ 50 | const ascendExperimentsPlugin = { 51 | name: PLUGIN_LIST.EXPERIMENTS, 52 | config: { 53 | defaultValues, 54 | }, 55 | exec: AscendExperiments 56 | } 57 | 58 | /* 59 | * ascend's initialization with basic configuration and ascend-experiments plugin 60 | */ 61 | export const initAscend = async () => { 62 | return await Ascend.init({ 63 | httpConfig, 64 | plugins: [ascendExperimentsPlugin, ...otherPlugins], 65 | }); 66 | }; 67 | ``` 68 | 69 | --- 70 | 71 | ## Use Experiments 72 | 73 | ### Fetch experiment values 74 | 75 | Use following code snippet to initialise Experiment Plugin once. This operation is async. So it depends upon the consumer whether they want to wait for this operation to complete or proceed further. 76 | 77 | NOTE: By default, on initialisation of the experiment plugin, it fetches the values of API Paths configured with the plugin. 78 | 79 | ```typescript 80 | /* 81 | * Get the experiment plugin instance 82 | */ 83 | const experimentPlugin = await Ascend.getPlugin(PLUGIN_LIST.EXPERIMENTS); 84 | 85 | // Get boolean flag 86 | const boolVal = await experimentPlugin.getBooleanFlag('API_PATH', 'VARIABLE_NAME'); 87 | 88 | // Get string flag 89 | const stringVal = await experimentPlugin.getStringFlag('API_PATH', 'VARIABLE_NAME'); 90 | 91 | // Get integer flag 92 | const intVal = await experimentPlugin.getIntFlag('API_PATH', 'VARIABLE_NAME'); 93 | 94 | // Get double flag 95 | const doubleVal = await experimentPlugin.getDoubleFlag('API_PATH', 'VARIABLE_NAME'); 96 | 97 | // Get all variables for an experiment 98 | const allVars = await experimentPlugin.getAllVariables('API_PATH'); 99 | ``` 100 | 101 | --- 102 | 103 | ## Use Events 104 | 105 | Coming soon... 106 | 107 | --- 108 | 109 | ## Example Usage in React Component 110 | 111 | ```typescript 112 | import React, { useEffect, useState } from 'react'; 113 | import { View, Text, Button } from 'react-native'; 114 | import { initAscend } from './initAscend'; 115 | 116 | const MyComponent = () => { 117 | const [experimentValue, setExperimentValue] = useState(false); 118 | 119 | useEffect(() => { 120 | const initializeSDK = async () => { 121 | try { 122 | await initAscend(); 123 | console.log('Ascend initialized successfully'); 124 | } catch (error) { 125 | console.error('Failed to initialize Ascend:', error); 126 | } 127 | }; 128 | 129 | initializeSDK(); 130 | }, []); 131 | 132 | const getExperimentValue = async () => { 133 | try { 134 | const experimentPlugin = await Ascend.getPlugin(PLUGIN_LIST.EXPERIMENTS); 135 | const value = await experimentPlugin.getBooleanFlag('DUMMY_API_PATH_HERE_1', 'value'); 136 | setExperimentValue(value); 137 | } catch (error) { 138 | console.error('Failed to get experiment value:', error); 139 | } 140 | }; 141 | 142 | return ( 143 | 144 | Experiment Value: {experimentValue.toString()} 145 |