Software Engineering Capstone · PUC Minas · 2023 TCC de Pós-Graduação em Engenharia de Software · PUC Minas · 2023

MyPlant

A web platform for urban gardeners

Uma plataforma web para jardineiros urbanos

TypeTipo
Personal capstone project
Projeto individual de pós-graduação
StackStack
Node.js · Vue.js · MySQL · TypeORM
YearAno
2023
Summary Resumo do Projeto

Closing the urban gardening knowledge gap in Brazil

Fechando a lacuna de conhecimento na jardinagem urbana no Brasil

Personal capstone project for a Postgraduate degree in Software Engineering at PUC Minas Virtual. Full ownership of problem framing, product design, and implementation — with no external client or team.

Projeto individual de conclusão de curso de Pós-Graduação em Engenharia de Software na PUC Minas Virtual. Responsabilidade total sobre a definição do problema, o design do produto e a implementação — sem cliente externo ou equipe.

The Problem

O Problema

Urban gardening is one of the most accessible climate adaptation strategies, yet in Brazil there are very few apps supporting everyday people in planting and maintaining gardens. The main barrier is a lack of accessible technical knowledge about species, planting times, and maintenance.

A jardinagem urbana é uma das estratégias de adaptação climática mais acessíveis, mas no Brasil há muito poucos aplicativos que apoiam pessoas comuns no plantio e na manutenção de jardins. A principal barreira é a falta de conhecimento técnico acessível sobre espécies, épocas de plantio e manutenção.

Objectives

Objetivos

Design
Design

Help users design and plan their own gardens with an accessible, education-oriented experience from beginner to professional.

Ajudar os usuários a projetar e planejar seus próprios jardins com uma experiência acessível e orientada à educação, do iniciante ao profissional.

Community
Comunidade

Enable community interaction and knowledge-sharing around species, pests, planting calendars, and local gardens.

Habilitar interação comunitária e compartilhamento de conhecimento sobre espécies, pragas, calendário de plantio e jardins locais.

Data & AI
Dados & IA

Build a plant database with complete technical data sheets, weather integration, and AI-based plant identification.

Construir um banco de dados de plantas com fichas técnicas completas, integração de clima e identificação de plantas por IA.

Engineering
Engenharia

Apply design techniques at every stage of the software project to ensure a user-centered, design-first product.

Aplicar técnicas de design em todas as etapas do projeto de software para garantir um produto centrado no usuário.

UX Research Product Design Figma Requirements Engineering Engenharia de Requisitos Database Design Modelagem de Dados Node.js / Vue.js Test Planning Planejamento de Testes

The Design Process O Processo de Design

From problem space to navigable prototype

Do espaço do problema ao protótipo navegável

Research

Pesquisa

The research phase began with a contextual and environmental analysis, drawing on IPCC reports and academic literature on urban gardening. Key finding: approximately 78.8% of Latin America's population lives in urban centers — and most cities in the region have little adaptive capacity to climate change. Urban gardening emerged as one of the most scalable local responses, but also one of the least supported by digital tools.

A fase de pesquisa começou com uma análise contextual e ambiental, baseada em relatórios do IPCC e literatura acadêmica sobre jardinagem urbana. Descoberta central: aproximadamente 78,8% da população da América Latina vive em centros urbanos — e a maioria das cidades da região tem pouca capacidade adaptativa à mudança climática. A jardinagem urbana surgiu como uma das respostas locais mais escaláveis, mas também uma das menos apoiadas por ferramentas digitais.

A market scan confirmed the gap: existing apps were either international in focus, technically complex, or not designed for small-scale urban gardeners. Three user types were identified: the Jardineiro (primary user), the Admin (managing plant data), and the Community Manager (moderating forums and marketplace).

Um mapeamento de mercado confirmou a lacuna: os aplicativos existentes eram ou focados em mercados internacionais, tecnicamente complexos, ou não projetados para jardineiros urbanos de pequena escala. Três tipos de usuário foram identificados: o Jardineiro (usuário principal), o Admin (gerencia dados de plantas) e o Gestor de Comunidade (modera fórum e marketplace).

Product Design

Design do Produto

Product design centred on mapping the full scope of the platform through a use case diagram with 22 use cases across all three roles. From there, 26 functional requirements and 11 non-functional requirements were derived — covering plant database search, a garden design and planning tool, a planting calendar, weather integration, AI-based plant identification via Google Lens, a community forum, a plant exchange marketplace, and GPS-based mapping of local gardens.

O design do produto centrou-se no mapeamento do escopo completo da plataforma por meio de um diagrama de casos de uso com 22 casos distribuídos entre os três perfis. Derivaram-se 26 requisitos funcionais e 11 não funcionais — cobrindo busca no banco de plantas, ferramenta de design de jardim, calendário de plantio, integração de clima, identificação por IA via Google Lens, fórum comunitário, marketplace de trocas e mapa GPS de jardins locais.

UI Design

Design de Interface

The interface was designed in Figma as a high-fidelity, navigable prototype. The visual language draws on the culture of gardening — deep greens, earthy neutrals, and approachable typography — while following accessibility principles for a general, non-expert audience.

A interface foi projetada no Figma como um protótipo de alta fidelidade e navegável. A linguagem visual parte da cultura da jardinagem — verdes profundos, neutros terrosos e tipografia acessível — seguindo princípios de acessibilidade para um público geral, não especialista.

View navigable prototype on Figma ↗

Ver protótipo navegável no Figma ↗


The Engineering Process O Processo de Engenharia

From design artefacts to working software

Dos artefatos de design ao software funcionando

Requirements

Requisitos

22
Use cases
Casos de uso
Across three actor types — Jardineiro, Admin, Community Manager
Distribuídos entre três perfis — Jardineiro, Admin, Gestor de Comunidade
26
Functional requirements
Requisitos funcionais
Plant search, garden planner, calendar, weather API, AI ID, forum, marketplace, GPS map
Busca de plantas, planejador de jardim, calendário, API de clima, IA, fórum, marketplace, mapa GPS
11
Non-functional requirements
Requisitos não funcionais
Performance, usability, map load under 30s, open-source stack preference, 3-garden free tier limit
Performance, usabilidade, mapa carregando em até 30s, preferência por stack open-source, limite de 3 jardins no plano gratuito

Domain Model

Modelo de Domínio

The domain model captures the core entities and their relationships — the conceptual bridge between product design and the database schema.

O modelo de domínio captura as entidades principais e seus relacionamentos — a ponte conceitual entre o design do produto e o esquema do banco de dados.

Jardineiro
PK idJardineiro nomeJardineiro email cidade / estado criarJardim() exportarPlanilha()
Jardim
PK idJardim FK idJardineiro nomeJardim croqui (VARBINARY) inserirPlanta()
Planta
PK idPlanta FK idJardineiro nomePopular nomeCientífico
FichaTécnica
PK idFichaTécnica FK idPlanta épocaPlantio pragaDoenças plantaHarmônica solo / clima
Comunidade
PK idComunidade categoriaFórum criar() ler() atualizar() apagar()
ModeloJardim
PK idModelo FK idJardineiro nomeModelo descrição imagem (VARBINARY)
Fig. 2 — Simplified domain class diagram. Full diagram includes Admin, GestorComunidade, MarketplaceEventos, DesignJardim, LicençaPremium, and ConteúdoInformativo.
Fig. 2 — Diagrama de classes de domínio simplificado. O diagrama completo inclui Admin, GestorComunidade, MarketplaceEventos, DesignJardim, LicençaPremium e ConteúdoInformativo.

Database

Banco de Dados

The relational model was implemented in MySQL using TypeORM, chosen for its dual SQL/NoSQL support and native TypeScript integration. The schema runs across three databases in parallel: MySQL/PostgreSQL for structured relational data, MongoDB for lists and location metadata, and Redis for session cache and notifications.

O modelo relacional foi implementado em MySQL usando TypeORM, escolhido pelo suporte dual SQL/NoSQL e integração nativa com TypeScript. O esquema roda em três bancos em paralelo: MySQL/PostgreSQL para dados relacionais estruturados, MongoDB para listas e metadados de localização, e Redis para cache de sessão e notificações.

Test Plan

Plano de Testes

# Use Case Caso de Uso Expected Result Resultado Esperado
1 UC1 — Plant search (exists) UC1 — Busca de planta (existe) Technical data sheet displayed Ficha técnica exibida
2 UC1 — Plant search (not found) UC1 — Busca de planta (não encontrada) Error message with redirect to community forum Mensagem de erro com redirecionamento ao fórum
3 UC2 — Garden models UC2 — Modelos de jardim User can add preferred species and save layout Usuário pode adicionar espécies e salvar layout
4 UC5 — Plant ID via forum UC5 — Identificação via fórum Post visible to community for responses Post visível para a comunidade responder
5 UC5 — Plant ID via AI UC5 — Identificação via IA Results page with plant information returned Página de resultados com informações da planta
6 UC5 — Security: offensive content UC5 — Segurança: conteúdo ofensivo Content blocked by moderation system Conteúdo bloqueado pelo sistema de moderação
7 UC8 — Forum search (found) UC8 — Busca no fórum (encontrado) Matching threads listed and displayed Threads correspondentes listadas e exibidas
8 UC8 — Forum search (not found) UC8 — Busca no fórum (não encontrado) Prompt inviting user to start the first thread Convite para o usuário iniciar o primeiro thread
Fig. 4 — Selected test cases from the test plan (8 of 10 documented)
Fig. 4 — Casos de teste selecionados do plano de testes (8 de 10 documentados)

App Development

Desenvolvimento do App

The application was built with a Node.js + Express backend and a Vue.js + TypeScript frontend, deployed via a serverless hosting platform. By the end of the project, the relational model was implemented with all relationships defined, a complete plant data sheet was created, and the planting date timer feature was built and working. Full search functionality remained partially incomplete — a direct consequence of scope and timeline constraints discussed in the next section.

A aplicação foi construída com backend Node.js + Express e frontend Vue.js + TypeScript, publicada via plataforma de hosting serverless. Ao final do projeto, o modelo relacional estava implementado com todos os relacionamentos definidos, uma ficha técnica completa de planta foi criada e o timer de datas de plantio foi desenvolvido e funcionando. A funcionalidade completa de busca permaneceu parcialmente incompleta — consequência direta das restrições de escopo e prazo discutidas na próxima seção.

GitHub ↗ Live Demo ↗ GitHub ↗ Demo ao Vivo ↗

Lessons Learned Lições Aprendidas

What I would do differently

O que eu faria diferente

This project ran alongside a post-covid health recovery, a full restart after canceling the first concept, and a steep self-directed learning curve. The reflections below are specific to myPlant, but inform how I approach every project since.

Este projeto aconteceu em paralelo com uma recuperação de saúde pós-covid, um reinício completo após cancelar o primeiro conceito, e uma curva íngreme de aprendizado autodirigido. As reflexões abaixo são específicas ao myPlant, mas informam como abordo cada projeto desde então.

01
Design and engineering need to be one workflow, not two sequential phases
Design e engenharia precisam ser um só fluxo, não duas fases sequenciais

My design background gave me a strong product vision, but also meant I designed features without engineering constraints in mind. The drag-and-drop garden planner, the Google Lens integration, the GPS map — all made sense as UX flows. What I hadn't considered were the architectural implications. In a future project I would prototype in Figma and validate technical feasibility at the same time.

Meu histórico em design me deu uma visão de produto forte, mas também significou que projetei funcionalidades sem levar em conta as restrições de engenharia. O planejador de jardim com drag-and-drop, a integração com Google Lens, o mapa GPS — todos faziam sentido como fluxos de UX. O que não considerei foram as implicações arquiteturais. Em um projeto futuro, prototiparia no Figma e validaria a viabilidade técnica ao mesmo tempo.

02
Overscoping created decision paralysis more than ambition
Escopo excessivo gerou paralisia de decisão mais do que ambição

Twenty-six functional requirements across three user roles, five external service integrations, and three parallel databases was an ambitious specification for a solo project. The consequence wasn't just incomplete implementation — it was that I didn't know where to start learning. A smaller, well-defined MVP would have produced a more complete and stable product.

Vinte e seis requisitos funcionais entre três perfis de usuário, cinco integrações externas e três bancos em paralelo era uma especificação ambiciosa para um projeto solo. A consequência não foi só implementação incompleta — foi não saber por onde começar a aprender. Um MVP menor e bem definido teria produzido um produto mais completo e estável.

03
The engineering training changed how I design — permanently
A formação em engenharia mudou como eu faço design — permanentemente

Despite the challenges, completing a Software Engineering postgraduate has fundamentally changed how I approach design problems. I now think in data models when I draw components. I consider API response shapes when I design loading states. I ask about database constraints before committing to a feature flow. That integrated perspective is the most durable thing myPlant taught me.

Apesar dos desafios, concluir a pós-graduação em Engenharia de Software mudou fundamentalmente como abordo problemas de design. Hoje penso em modelos de dados quando desenho componentes. Considero formatos de resposta de API quando projeto estados de carregamento. Questiono restrições de banco de dados antes de me comprometer com um fluxo. Essa perspectiva integrada é o que o myPlant me ensinou de mais duradouro.