TraitCapture

Archived static copy of the TraitCapture project site — open source tools for high-throughput plant phenomics, long-term environmental monitoring, and data visualization.

This project is maintained by borevitzlab

About TraitCapture

This project was developed under Justin Borevitz and Tim Brown at the Australian National University for the SpectroPhenoClimatron project.

Its datasets are maintained by the ANU node of the Australian Plant Phenomics Facility.


This site was powered by: Bootstrap, D3, Flask, IIPImage, Jinja2, MongoDB, NGINX, OpenSeadragon, Potree, Stem & Tor.

And includes code from: SPC-Eyepi & SPC-TimestreamUI.


How this site worked

A short technical history, recovered during archival in 2026 for future readers interested in our historic software stacks. The live application and database have since been retired; the research data they held is preserved separately as an open archive.

At its core, the TraitCapture site was a single Flask (Python 3) web application backed by a MongoDB database. The Python code talked to MongoDB through the MongoEngine object-document mapper, and all of the large binary assets - camera images, tiled gigapixel images and point clouds - were stored inside MongoDB itself using GridFS rather than on the filesystem. A single database, supersite_database, held the whole platform: projects, experiments, trials, plants, accessions, time-lapse image series (“TimeStreams”), point clouds, measurements and users.

The same codebase served two public front-ends - traitcapture.org and phenocam.org - from one shared database. In production the app ran behind swag (an nginx + Let’s Encrypt reverse proxy), which in turn sat behind Cloudflare for DNS, caching and TLS at the edge. Longer-running and scheduled jobs (image processing, housekeeping) were handed off to Celery workers over a RabbitMQ message queue. Sign-in used flask-login with flask-bcrypt-hashed passwords and federated login via the AAF, and operational alerts were pushed to Slack.

Data came in from the field. Growth-chamber and field units - Raspberry Pi computers running the group’s open-source spc-eyepi camera software - captured time-lapse imagery and phoned home over Tor hidden services (which is why each device carried its own onion address and keys), depositing images into GridFS in the fixed TimeStream naming structure described on the Resources page.

In the browser, that data was brought to life with a set of specialist viewers: OpenSeadragon and an IIPImage tile server for deep-zoom gigapixel images, Potree for WebGL point clouds, and D3 for interactive graphs.

flowchart TB
  browser["Browser viewers: OpenSeadragon / Potree / D3"]
  cf["Cloudflare - DNS + CDN + TLS edge"]
  swag["swag - nginx + Let's Encrypt"]
  app1["Flask app - traitcapture.org"]
  app2["Flask app - phenocam.org"]
  mongo[("MongoDB 4.0 - supersite_database + GridFS")]
  rmq["RabbitMQ + Celery - async / scheduled jobs"]
  pi["Field devices - Raspberry Pi + spc-eyepi cameras"]

  browser --> cf
  cf --> swag
  swag --> app1
  swag --> app2
  app1 --> mongo
  app2 --> mongo
  app1 --> rmq
  rmq --> mongo
  pi -. "Tor hidden service" .-> app1
  pi -. "TimeStream image upload" .-> mongo

Extended code licenses

An extended list of licensed code used on this site was served at static/js/dist/license.js. It is preserved verbatim here. Its original disclaimer noted that this is “likely not to be an exhaustive list of all the licensed code used on this site.”