A web platform for urban gardeners
Uma plataforma web para jardineiros urbanos
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.
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.
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.
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.
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.
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.
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 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.
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.
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.
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.
| # | 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 |
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.
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.
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.
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.
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.