Skip to content
Simple Web Interface for Apache Pulsar
Vue JavaScript Dockerfile
Branch: master
Clone or download
Latest commit 9d77bb4 Nov 19, 2019
Type Name Latest commit message Commit time
Failed to load latest commit information.
assets Initial commit May 8, 2019
docs Update docs Jun 7, 2019
layouts Feat. peek messages Sep 3, 2019
middleware Initial commit May 8, 2019
pages Back to 0.5.1 Nov 19, 2019
plugins Feat. peek messages Sep 3, 2019
serverMiddleware Feat.: env var for fct worker url Jun 7, 2019
services Add base url Nov 19, 2019
store Add base url Nov 19, 2019
.dockerignore Add docker env May 26, 2019
.gitignore Change breadcrumb and look Jun 3, 2019
.npmignore Back to 0.5.1 Nov 19, 2019
Dockerfile Add docker env May 26, 2019
LICENSE cli May 22, 2019
localconfig.json Feat. add functionWorkerUrl for invoking a worker cluster Jun 6, 2019
nuxt.config.js Back to 0.5.1 Nov 19, 2019
package-lock.json 0.5.2 Nov 19, 2019
package.json Back to 0.5.1 Nov 19, 2019

GitHub license GitHub version


Simple Web Interface for Apache Pulsar

Pulsar logo


There are several ways to use pulsar-express:

  • By cloning the projet and running it locally (see Development section)
  • By running a docker image: docker run -it -p 3000:3000 bbonnin/pulsar-express
    • You can set a connection url in the command: docker run -it -p 3000:3000 -e PE_CONNECTION_URL=http://host.docker.internal:8080 bbonnin/pulsar-express
    • Important: the calls to the Pulsar API are done on server side (i.e. from the container), so your Pulsar must be reachable from the container (do not use localhost :)). A solution: you can add --network=host to the command line (but, it's only working on Linux...)
  • By installing it using npm
# Install it globally
$ npm install pulsar-express -g

# Start it
$ pulsar-express

        │ PULSAR EXPRESS │

        => Open http://localhost:3000

# Start it on a specific port
$ PORT=8000 pulsar-express

        │ PULSAR EXPRESS │

        => Open http://localhost:8000

If you want to configure connections (to be available to all users), you can:

  • Create a json file with the connections:
  { "name": "test cluster", 
     "url": "http://test-cluster-host:8080" },
  { "name": "integration cluster", 
     "url": "http://int-cluster-host:8080", 
     "token": "<YOUR_TOKEN>" },
  { "name": "prod cluster", 
     "url": "http://prod-cluster-host:8080", 
     "fctWorkerUrl": "http://prod-fct-worker-cluster-host:6750",
     "token": "<YOUR_TOKEN>" },
  • and set the env variable PE_CONFIG_FILE
export PE_CONFIG_FILE=/path/to/my/config.json
  • Or you can also set a connection URL
export PE_CONNECTION_URL=http://pulsar-host:8080

# Without a name, the url will be used (hostname:port),
# Or you can set a name:
export PE_CONNECTION_NAME=my-pulsar

# A token if needed:

From there, you can connect with your browser to the url above !

Pulsar express home

Quick start

If you haven't defined a connection, the first step is to go the Connections page and add a new connection. These connections are stored on client side (localstorage of your browser)

Pulsar express connections


In this page, you can see some basic informations about your clusters.

Pulsar express overview


Pulsar express clusters


Pulsar express clusters


Pulsar express clusters


Pulsar express topics

Pulsar express topics


Pulsar express functions

Pulsar express function


To enable security in Pulsar, please read [](the docs).

For example, with token authentication with a secret key (more details,,

  • Create a secret key:
pulsar tokens create-secret-key --output my-secret.key --base64
  • Create a token for pulsar-express
pulsar tokens create --secret-key file:///path/to/my-secret.key \
            --subject pulsar-express
  • Configure your broker (conf/broker.conf or conf/standalone.conf)
  • Configure your workers (conf/functions_worker.yml)
clientAuthenticationPlugin: "org.apache.pulsar.client.impl.auth.AuthenticationToken"
clientAuthenticationParameters: "token:<YOUR_TOKEN>"

authenticationEnabled: true
authorizationEnabled: true
  tokenSecretKey: "file:///path/to/my-secret.key"
  - pulsar-express
  • Test a call to the API (you should get a 401 response without the token):
curl localhost:8080/admin/v2/clusters  -H "Authorization: Bearer <YOUR_TOKEN>"



This app has been developed with Nuxt.js.

# install dependencies
$ npm install

# serve with hot reload at localhost:3000
$ npm run dev

# build for production and launch server
$ npm run build
$ npm start

For detailed explanation on how things work, checkout Nuxt.js docs.

For Docker:

  • Build: npm run docker-build
  • Test locally: npm run docker-run
  • Tag: docker tag pulsar-express USER/pulsar-express:VERSION
  • Publish: docker push USER/pulsar-express:VERSION

To do

A lot of things of course :), but the main step is to change the architecture and add a backend instead of making the queries from the browser. This backend could provide api, cache, better management of configuration, ...

  • Clusters
    • connections to clusters (configured on server and client side)
    • list clusters
    • get config of a cluster
    • manage clusters
  • Tenants
    • list the tenants
    • create a tenant (simple way)
    • delete a tenant
    • get config of a tenant
    • update config of a tenant
  • Namespaces
    • list the namespace
    • create a namespace
    • delete a namespace
    • get config of a namespace
    • update config of a namespace
    • any other features (persistence policies, messages ttl, backlog quotas...)
  • Topics
    • list the topics
    • create a topic
    • create a partitioned topic
    • delete a topic
    • get stats about a topic
    • get subscriptions of a topic
    • manage subscriptions
    • manage partitioned topics
    • any other features (reset cursor, expire messages, ...)
      • peek messages
  • Functions
    • list the functions
    • get config of a function
    • start/stop instances
    • manage functions (deploy ? delete ? create ? simple python function for test purpose ?)
  • Connections
    • update a connection



You can’t perform that action at this time.