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
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.
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
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.”