Experimental features

Experimental features

Take a peek behind the curtain and help us test new ideas. Your feedback is highly appreciated!
NOTE: The content on this page describes experimental features and is not available in GoodData products.

GoodData.Lite

A complete analytical solution running in your browser.

I'm interested
Model Model Model

Lightning fast serverless analytics

Load your data once from sources such as JSON, CSV, SQLite files, REST, or GraphQL APIs, and structure it with our in-browser Data Modeler. GoodData.Lite can handle up to 200MB of data.

Declarative Data Modeler

Model your data in your app's codebase

Define your data model in the code. Already have a schema for GraphQL or Open API? No problem, there is a plugin for that!

bi.model('User', {
    id: 'pk',
    firstName: 'string',
    lastName: 'string',
    fullName: ((user:any) => user.firstName + user.lastName),
    age: 'number',
    manager: { ref: 'User.id' },
    projects: { ref: '[Projects.id]' },
});

Seamless data querying

Just ask for the data you need

GoodData.Lite Query Engine can aggregate, filter, sort, and segment your data automatically based on the Data Model. No need to write SQL or cumbersome data transformations manually.

// Get an average project duration by user
const myChartData = await bi
    .aggregate('Project.duration', 'avg')
    .filter('User.role', '!=', 'manager')
    .sort('Project.startDate', 'desc')
    .segment('User.fullName');

Flexible data visualisation options

Choose your favourite framework for data rendering

GoodData.Lite does not limit you when it comes to visualizations. Choose your favorite library (like d3, Highcharts, Charts.js etc.) and your favorite framework (like React, Angular or Vue) - we've got you covered.

const MyReactChart = () => {
    // Average user age by role
    const [data, error, loadingState] = bi.useQuery<DataType>({
        aggregate: ['User.age', 'avg'],
        segment: ['User.role'],
    });
    
    if (error) return <Error message={error} />;
    
    if (loadingState !== 'loaded') return <Loader />;
    
    // ...
}
automatic data loading icon

Automatic data loading

For well-structured APIs, such as GraphQL or canonical REST API, GoodData.Lite automatically loads the data that is required on-demand for chart rendering.

// Import the whole model from a GraphQL schema
// with automatic lazy loading 
bi.fromGraphQL (graphQLSchema, rootURL);
// Import the whole model from a GraphQL schema
// with automatic lazy loading 
bi.fromGraphQL (graphQLSchema, rootURL);
offline mode and data persistence icon

Offline mode and data persistence

In GoodData.Lite, we are using ServiceWorkers to unlock the UI thread and cache the in-browser database for offline usage. Specify which data to persist and update the data granularly on-demand or over an interval.

// Register service worker
bi.startServiceWorker();

// Define model with caching
await bi.model('Project', {/* ... */},{
    cache: '2h',
});

// Force-reload data
const projCount = await bi
    .aggregate('Project.id', 'count')
    .reload();
// Register service worker
bi.startServiceWorker();

// Define model with caching
await bi.model('Project', {/* ... */},{
    cache: '2h',
});

// Force-reload data
const projCount = await bi
    .aggregate('Project.id', 'count')
    .reload();
built by developers icon

Built by developers, for developers...

GoodData.Lite is written in TypeScript and comes with extensive in-code documentation for the best developer experience.

type User = {
    id: string,
    firstName: string,
    lastName: string,
    age: number,
    // ...
};

bi.model<User>('User', {/* ... */});
type User = {
    id: string,
    firstName: string,
    lastName: string,
    age: number,
    // ...
};

bi.model<User>('User', {/* ... */});

Want to know more?

Reach out to us for more information

I'm interested