node package manager
We need your input. Help make JavaScript better: Take the 2017 JavaScript Ecosystem survey »



CircleCI JavaScript Style Guide

Project Structure

Lilypad Apps and Ecosystem



The build is on DockerHub

docker pull mada/lilypad

and also on DaoCloud:

docker pull


└── Group
  └── Board
      └── Card
          ├── ChartCard
          ├── MetricCard
          └── SortingTableCard
  • Group: a collections of Board -> sections in Domo, page in Domo.
  • Board: a placeholder for collections of Card -> sub-page in Domo.
  • Card: a displaying unit. -> card in Domo.

Naming Conventions

  • Card: Name${CardName}

How to Start


  1. Webpack first
  2. start all the docker services
  • export aws env variables
export AWS_SECRET_ACCESS_KEY='any_value_is_ok'
export AWS_ACCESS_KEY_ID='any_value_is_ok'
  • export douban env variables
export DOUBAN_CLIENT_ID='douban client id'
export DOUBAN_CLIENT_SECRET='douban client secret'
  • login docker first (your docker user id should in mada), ask for permission if not so
  • run
# in case the final cmd in failed, just run it again a few seconds later. 
npm run build
  1. start lilypad
npm start

app development

make sure you have followed the instructions in development section. Then just do



In production, fake-leancloud-auth are replaced by real leancloud service. Therefore, you have to provide leancloud appId and appKey through environment variables -

npm run build
LEANCLOUD_APP_ID=your_app_id LEANCLOUD_APP_KEY=your_app_key npm run start:prod

docker build

Environment Variables

name description example
LEANCLOUD_APP_KEY app key of LeanCloud app wm03Mel0UCyNr2rkjd2OVmjW
LEANCLOUD_APP_ID app id of LeanCloud app khFeY6fqCpsEvb4kI4RAJ7HU-gzGzoHsz
TURBINE_URL turbine url http://turbine:8080
BEETLE_URL beetle url http://beetle:8080
REDIS_URL redis url redis://redis:6379
docker build -t lilypad .
docker run -d -p 3000:3000 \


Mount Point

All api services provided will be mounted on /api. Only request with valid basic authorization field is allowed.

  • /card

    • GET: query list of cards
    • POST: create single card
      • body: graphQL
  • /card/:id

    • GET: query single card
    • POST: update single card // not implemented yet
  • /board

    • GET: query list of boards
    • POST: create single board
      • body: graphQL
  • /board/:id

    • GET: query single board
    • POST: create single board
      • body: graphQL
  • /data-set

    • GET: query list of datasets
    • POST: create single dataset
      • body: graphQL
  • /data-set/:id

    • GET: query single dataset
  • /account

    • GET: query list of accounts
    • POST: create single account
      • body: graphQL
  • /account/:id

    • GET: query single account
    • POST: update single account // not implemented yet
  • /data

    • POST: upload csv data
      • query: dataSetIds[, type]
      • form: multiparty-formdata
    • GET: query data by data accessor or sql
      • query: type, (dataAccessor | query)
  • /etl/sync

    • GET: sync dataset
  • /connectors

    • GET: query list of connectors
  • /:connector/tables

    • GET: query list of tables
  • /version

    • GET: query versions of backend services