Townsourced

Startup / Web Application

Description

Townsourced is a locally moderated community bulletin board, built to help communities discover events, share, shop and sell locally.

Problems to solve

Craigslist

Too broad, not available to small communties

Unmoderated and overrun with SPAM

Facebook pages

Are unsearchable

Hard to moderate

Buying and selling online is unsafe

Requires sharing personal information

Cash-only transactions with strangers

Our Solution

Townsourced allows for communities of any size to create a space for buying and selling, sharing events, job postings, and volunteer opportunities.

Towns are easily moderated with auto-moderation tools, and users can post once simultaneously to all of their communities.

Buying and selling can be coordinated through built-in messaging, and users have the option of completing these transactions electronically so they don’t have to worry about carrying cash to a meetup with a stranger.

Technical Goals

Front-end

Simple and intuitive

Responsive and scalable to screens of all sizes

Back-end

Horizontally Scalable with low effort

Flexible REST API for future mobile development

Technical Overview

Townsourced was built to be horizontally scalable from the beginning. Whether it’s serving 100 users or a million, the architecture will look the same. To accomplish this, we made sure to use technologies that could easily shard and scale as needed at every layer.

The first of those layers are a load-balanced set of web servers written in Go that provide state management and coordination between the other layers, such as using consistent hashing to balance keys across multiple memcached servers.

The single source of truth in Townsourced is a cluster of RethinkDB databases. We went with RethinkDB because it is horizontally scalable while still allowing for advanced operations like joins and location queries, all while maintaining data integrity. Full-text searching is provided by an Elasticsearch cluster, whose consistency is ensured by verifying its content with the RethinkDB layer.