# Ponder, a group blogging platform

> A look back at Ponder: what it was, the technologies behind it, and the lessons I took away from building it.

- Years: 2019 to 2021
- My contributions: Client development, server development and devOps.
- Page: https://gustavo.is/remembering/ponder

## Inception and purpose

Founded in early 2019 by [Kristen Pavle](https://twitter.com/khpavle), [Dave Gorum](https://twitter.com/davegorum) and me (Gustavo Gallegos), Ponder was a blogging platform focused on simplicity aimed at people that wanted to publish a blog collaboratively.

We built a product where friends could create content together, have private discussions and publish their work to the web.

We worked hard to design a product that would promote meaningful content and meaningful discussions as a small counterbalance to prevailing social media trends.

## Features

### Editor

- Chatlog-style blog post authoring
- Optimistic updates
- Continuous auto-save
- Independent inputs can be reordered, edited or deleted
- Images can be uploaded via file upload or drag and drop
- Unlimited image uploads
- Images stored in DigitalOcean Spaces via the AWS S3 driver

Walkthrough video: https://player.vimeo.com/video/482506828

### Conversations

- One-on-one conversations for more meaningful discussions
- Private to the group: conversations are not published to the blog
- Message inbox
- Real-time in-app notifications powered by GraphQL subscriptions (urql client, apollo server)
- Email notifications via Postmark

Walkthrough video: https://player.vimeo.com/video/482506771

### Collections

- Organize your content by adding posts to collections shared with all members of the blog
- View collection feeds
- Personalize your collection with cover image and metadata
- Assign a unique url to a collection feed to share with anyone

Walkthrough video: https://player.vimeo.com/video/482505654

### Groups

- Create up to 10 different blogs
- Invite any number of members
- Each blog is private and isolated from the rest, with its own set of members
- A privacy-first model gives you a different identity for each blog while still being able to context switch between them from any screen
- Owner can assign (and revoke) admin privileges to any member
- Pinnable announcements for member feeds

Walkthrough video: https://player.vimeo.com/video/482507258

### Publishing

- Once a blog is made public, all published content is available at a personalized ponder.to/[blog] url
- Public blogs can be personalized by admins by adding moods (color themes, layout, font and styling presets) from the app.ponder.to site at any time, making each blog unique
- The public-facing blog site is a separate SSR Next.js application, covered in the Ponder Blogs retrospective

Walkthrough video: https://player.vimeo.com/video/482507338

## Lessons learned

### Utility is paramount.

Although finding my co-founders was not only unexpected but also quick, the process of distilling our purpose and ideas into a cohesive product plan took some time. Refining the market need and its proposed solution must happen as soon as humanly possible to begin testing your assumptions. The details of establishing a company and its principles can be a small side project or postponed in favor of small, incremental rounds of development to test utility in order to validate the product idea.

### Ask for help and honor the need of being part of a community.

Being the only technical founder sometimes felt like a lonely affair, especially being the first time back as a developer after several years of working as a Technical Program Manager. Even the technologies I knew had changed drastically in just a few years (just look at javascript), not to mention the new ones like GraphQL and graph databases. As time passed I became more excited about what I was learning, but sometimes I felt there wasn't someone to effectively share that excitement with. Thankfully this led me to search out communities where I could not only ask for learning help but also share the way I felt in general, mostly in Discord groups (shout out to [Kent C. Dodds](https://kentcdodds.com/)). This helped me stay in touch with like-minded people I could learn from.

### Be decisive when choosing a stack.

The good news about being the technology officer is that you get to call the shots about what tech to use, the bad news is having to face the tyranny of choice. I learned that you should time-box doing due diligence and research, get feedback from people you trust, make a decision and stick with it. It is very unlikely that the benefits of switching to a new framework, language, or tech once you've made significant progress will outweigh the compound gains of having learned your original choice. Consistency and mastery trump perfection.

### Be open to change.

Situations change. My understanding of situations also changes, I must always be open to change my assumptions of what the product should be based on the available evidence. At times it was difficult to change course when it involved the loss of work that was already done, especially because development time was our most needed resource. I learned to analyze the data at hand and course correct to the reality that it presents, no matter the sunk costs.

### Open communication is essential.

2019-2020 in hindsight was not the best time to start a company (understatement of the year). Even though remote collaboration has come a long way, prior to the pandemic it was easy to get together with my partners and hash out big ideas and lay out a direction and plan of action, course correcting as we went. Even small amounts of face to face interaction quickly became impossible come 2020. I learned that for a team to charge ahead in the same direction at such an early stage, everyone must be frank about not only their technical challenges but their emotional state and personal relationship with work. When building a company with others, it's important to help people understand how you feel about the work and how they can help you make things better.

### Continuously learn with clear direction informed by excitement.

I've never learned so many things and applied them in such a short period of time. I learned you have to start before you feel confident, and incrementally refactor as you learn more. When looking at old code I learned to stop cringing and instead thank myself for having taken that first step. I learned that learning itself is addictive so it must be done with focus and direction towards a goal or it can become an obstacle to producing results. Finally, I learned that I must factor in excitement as a compass to help guide me on what areas to focus, making the work feel more like play.

## Technologies

### React (Client framework)

- React SPA
- Bundled with Parcel
- Modern hook-based architecture

### Urql (GraphQL client)

- Lightweight GraphQL client
- Normalized cache
- Homegrown auth exchange
- Subscriptions for real time notifications

### Neo4j Aura (Graph database)

- Cypher resolvers for complex queries
- Simple analytics scripts
- Cypher GraphQL directive for simple queries

### Apollo GraphQL Server (GraphQL server)

- JWT expiration and refresh auth
- Authentication directives
- PubSub based subscriptions for real time notifications

### Vercel (Client hosting and deployment)

- SPA client deployment
- Utility lambda functions (JS)
- Domain management

### DigitalOcean (Server and media hosting)

- GraphQL server hosting
- Production, development and staging environments
- AWS S3 compatible storage

### Styled Components (CSS in JS library)

- CSS-in-JS to power Dave Gorum's beautiful design

### Integrations (Services used)

- Postmark (email notifications)
- Segment (analytics)
- Unsplash (photos)
- DigitalOcean (storage)
- Sentry (exception reporting)
