[{"data":1,"prerenderedAt":1667},["ShallowReactive",2],{"navigation":3,"index":22,"index-blogs":197},[4],{"title":5,"path":6,"stem":7,"children":8,"page":21},"Blog","/blog","blog",[9,13,17],{"title":10,"path":11,"stem":12},"Desafios dos Programadores Iniciantes em Moçambique ao Criar Backends para APIs de Pagamentos M-Pesa","/blog/mpesa-api-starter","blog/mpesa-api-starter",{"title":14,"path":15,"stem":16},"Ofuzah - Bloqueie o Acesso à Internet de Qualquer Aplicação no Windows com Um Clique","/blog/ofuzah-internet-blocker","blog/ofuzah-internet-blocker",{"title":18,"path":19,"stem":20},"QR Code Scanner: Um Leitor de QR Codes e Códigos de Barras Grátis e Sem Anúncios","/blog/qrcode-scanner","blog/qrcode-scanner",false,{"id":23,"title":24,"about":25,"blog":28,"body":31,"description":35,"experience":147,"extension":155,"faq":156,"hero":173,"meta":181,"navigation":182,"path":183,"seo":184,"stem":185,"testimonials":186,"__hash__":196},"index/index.yml","Téldio Calbe — Fullstack Developer",{"title":26,"description":27},"Sobre mim","Sou desenvolvedor fullstack e consultor de negócios com 6 anos de experiência em mercado, apaixonado por tecnologia, inovação e design funcional.  \nCrio soluções digitais inteligentes — desde landing pages e lojas online até plataformas complexas com integrações em tempo real e inteligência artificial.\n\nEspecializo-me em **React, Vue, Convex, Tailwind CSS**, com forte foco em **arquiteturas escaláveis, performance, UX e automação de processos**.  \n",{"title":29,"description":30},"Últimos artigos","Alguns dos meus pensamentos e experiências mais recentes sobre tecnologia e desenvolvimento.",{"seo":32,"title":24,"description":35,"hero":36,"about":55,"experience":56,"testimonials":81,"blog":106,"faq":107},{"title":33,"description":34},"Téldio Calbe — Fullstack Developer & Digital Solutions Consultant","Sou Albino TélDio Calbe, desenvolvedor fullstack e consultor de negócios especializado em soluções web modernas, automação e sistemas com IA. Crio experiências digitais inteligentes, escaláveis e centradas no utilizador.","Transformo ideias em sistemas web modernos, inteligentes e escaláveis. Especialista em React, Vue, Convex, Tailwind CSS e integração de APIs. Crio soluções digitais com propósito e performance.",{"links":37,"images":42},[38],{"label":39,"to":40,"color":41},"Contacte-me","https://linktr.ee/teldio","neutral",[43,46,49,52],{"src":44,"alt":45},"/amas.png","Random Image 1",{"src":47,"alt":48},"/meucv.png","Random Image 2",{"src":50,"alt":51},"/datadocs-logo.png","Random Image 3",{"src":53,"alt":54},"/mozanima-logo-blue.png","Random Image 5",{"title":26,"description":27},{"title":57,"items":58},"Experiência Profissional",[59,66,73],{"position":60,"date":61,"company":62},"Freelancer","2018 - 2020",{"name":60,"logo":63,"url":64,"color":65},"i-simple-icons-linear","#","#5E6AD2",{"position":67,"date":68,"company":69},"IT","2020 - 2023",{"name":70,"logo":71,"url":64,"color":72},"Pfuna Multservices Lda","i-simple-icons-nuxtdotjs","#00DC82",{"position":74,"date":75,"company":76},"CTO & Fullstack Dev","2023 - 2025",{"name":77,"logo":78,"url":79,"color":80},"EBP TEAM","/ebp-logo.png","https://eddybatineproducoes.com","#FF6363",[82,90,98],{"quote":83,"author":84},"Emma's approach to UX design completely transformed our product. She has a rare ability to balance beautiful aesthetics with functional simplicity. The redesign not only looked better, but it reduced our customer support tickets by 40% and increased conversion rates across all key metrics.",{"name":85,"description":86,"avatar":87},"Sarah Chen","Product Director at Bloom Finance",{"src":88,"srcset":89},"https://images.unsplash.com/photo-1487412720507-e7ab37603c6f?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=facearea&facepad=2&w=40&h=40&q=80","https://images.unsplash.com/photo-1487412720507-e7ab37603c6f?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=facearea&facepad=2&w=80&h=80&q=80 2x",{"quote":91,"author":92},"Working with Emma was the best decision we made for our startup. She didn't just deliver designs—she challenged our assumptions, conducted thorough user research, and created an experience that truly resonated with our audience. Her technical knowledge of front-end development meant the handoff to our engineering team was seamless.",{"name":93,"description":94,"avatar":95},"Michael Rodriguez","Co-founder of Wavelength Music",{"src":96,"srcset":97},"https://images.unsplash.com/photo-1472099645785-5658abf4ff4e?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=facearea&facepad=2&w=40&h=40&q=80","https://images.unsplash.com/photo-1472099645785-5658abf4ff4e?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=facearea&facepad=2&w=80&h=80&q=80 2x",{"quote":99,"author":100},"Emma stands out in her ability to translate complex sustainability data into intuitive interfaces. Her work on EcoTrack wasn't just visually stunning—it fundamentally changed how our users interact with environmental information. She approaches each problem with both creativity and analytical rigor, which is exactly what we needed.",{"name":101,"description":102,"avatar":103},"Dr. Aisha Johnson","Chief Innovation Officer at GreenTech Solutions",{"src":104,"srcset":105},"https://images.unsplash.com/photo-1573497019940-1c28c88b4f3e?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=facearea&facepad=2&w=40&h=40&q=80","https://images.unsplash.com/photo-1573497019940-1c28c88b4f3e?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=facearea&facepad=2&w=80&h=80&q=80 2x",{"title":29,"description":30},{"title":108,"description":109,"categories":110},"Frequently Asked Questions","Answers to common questions about my process and services.",[111,123,138],{"title":112,"questions":113},"Services & Process",[114,117,120],{"label":115,"content":116},"What services do you offer?","I specialize in UX/UI design and front-end development. This includes user research, wireframing, interactive prototyping, creating intuitive user interfaces, building responsive websites and web applications (especially with Vue.js/Nuxt.js), and developing design systems. My goal is to create seamless digital experiences from concept to deployment.\n",{"label":118,"content":119},"What is your design process like?","My process is collaborative and iterative, typically involving stages like Discovery & Research, Ideation & Prototyping, User Testing, Visual Design, and close collaboration with development teams during implementation. I tailor the process based on project needs, always focusing on user-centered solutions.\n",{"label":121,"content":122},"Do you work with startups?","Absolutely! I enjoy working with startups to help shape their product vision and create user-friendly interfaces from the ground up. I can adapt my process to fit the fast-paced startup environment.\n",{"title":124,"questions":125},"Pricing & Timelines",[126,129,132,135],{"label":127,"content":128},"How much does a project typically cost?","Project costs vary based on scope, complexity, features, and timeline. For comprehensive UX/UI design and front-end development projects, my engagements typically start around $5,000, with average projects ranging between $8,000 and $25,000. For consulting or specific design tasks, my day rate is $700.\n",{"label":130,"content":131},"What are your payment terms?","I generally require a 40% deposit to schedule the project and begin work, with the remaining 60% due upon successful project completion and delivery. I accept payments via bank transfer and Stripe.\n",{"label":133,"content":134},"How long does a typical project take?","Timelines depend heavily on the project's scope and complexity. Smaller projects might take 3-4 weeks, while larger, more involved projects can range from 2 to 4 months. I always provide a detailed timeline estimate after the initial discovery phase.\n",{"label":136,"content":137},"Do you offer retainers or ongoing support?","Yes, for clients needing ongoing design support, feature development, or maintenance, I offer monthly retainer options tailored to specific needs. Let's discuss if this is something you're interested in.\n",{"title":139,"questions":140},"About Me",[141,144],{"label":142,"content":143},"What do you enjoy most about your work?","I love the challenge of solving complex problems through design and technology. It's incredibly rewarding to see people interact with something I've created and find it genuinely useful and easy to navigate. Bridging the gap between user needs and technical possibilities is what truly excites me.\n",{"label":145,"content":146},"What are your hobbies outside of work?","When I'm not designing or coding, I enjoy exploring Boston's neighborhoods, trying out new coffee shops, and hiking in the nearby reservations. I'm also passionate about photography and occasionally contribute to open-source projects.\n",{"title":57,"items":148},[149,151,153],{"position":60,"date":61,"company":150},{"name":60,"logo":63,"url":64,"color":65},{"position":67,"date":68,"company":152},{"name":70,"logo":71,"url":64,"color":72},{"position":74,"date":75,"company":154},{"name":77,"logo":78,"url":79,"color":80},"yml",{"title":108,"description":109,"categories":157},[158,163,169],{"title":112,"questions":159},[160,161,162],{"label":115,"content":116},{"label":118,"content":119},{"label":121,"content":122},{"title":124,"questions":164},[165,166,167,168],{"label":127,"content":128},{"label":130,"content":131},{"label":133,"content":134},{"label":136,"content":137},{"title":139,"questions":170},[171,172],{"label":142,"content":143},{"label":145,"content":146},{"links":174,"images":176},[175],{"label":39,"to":40,"color":41},[177,178,179,180],{"src":44,"alt":45},{"src":47,"alt":48},{"src":50,"alt":51},{"src":53,"alt":54},{},true,"/",{"title":33,"description":34},"index",[187,190,193],{"quote":83,"author":188},{"name":85,"description":86,"avatar":189},{"src":88,"srcset":89},{"quote":91,"author":191},{"name":93,"description":94,"avatar":192},{"src":96,"srcset":97},{"quote":99,"author":194},{"name":101,"description":102,"avatar":195},{"src":104,"srcset":105},"cGWKofrHFJnbPNm2LZ9vZ4VjDOcXyeUTqUwt15IDzbo",[198,756,1151],{"id":199,"title":14,"author":200,"body":204,"date":748,"description":749,"extension":750,"image":751,"meta":752,"minRead":753,"navigation":182,"path":15,"seo":754,"stem":16,"__hash__":755},"blog/blog/ofuzah-internet-blocker.md",{"name":201,"avatar":202},"Albino T. Calbe",{"src":203,"alt":201},"/profile.png",{"type":205,"value":206,"toc":729},"minimark",[207,220,231,234,243,246,251,256,259,263,270,277,281,287,289,293,307,314,325,327,329,334,338,354,380,384,387,394,398,412,427,437,441,447,453,457,460,489,493,517,523,527,530,569,573,600,602,606,617,627,629,633,639,664,667,669,673,680,695,707,711,717,720],[208,209,210,211,215,216,219],"p",{},"Quem já usou o computador ligado ao ",[212,213,214],"strong",{},"hotspot do telemóvel"," conhece bem esta história, liga o computador para enviar um e-mail ou abrir uma página e, minutos depois, o pacote de ",[212,217,218],{},"dados móveis"," desapareceu. Não foi o navegador nem o e-mail. Foram aplicações a trabalhar em segundo plano: um programa a descarregar uma atualização, um launcher de jogos a atualizar um jogo, uma ferramenta qualquer a sincronizar ficheiros.",[208,221,222,223,226,227,230],{},"Foi exatamente essa dor que me levou a criar o ",[212,224,225],{},"Ofuzah",": um app para Windows que permite ",[212,228,229],{},"bloquear ou permitir o acesso à Internet de cada aplicação com um clique",".",[208,232,233],{},"Neste artigo, explico o problema, o que o Windows já oferece (e porque não chega) e como o Ofuzah resolve isto de forma simples.",[208,235,237,238],{"align":236},"center","\n  ",[239,240],"img",{"src":241,"alt":242},"https://raw.githubusercontent.com/teldio/ofuzah-releases/main/screenshots/pt-aplicacoes.png","Ofuzah — lista de aplicações com o interruptor de acesso à Internet",[244,245],"hr",{},[247,248,250],"h2",{"id":249},"o-problema-dados-móveis-a-desaparecer","O Problema: Dados Móveis a Desaparecer",[252,253,255],"h3",{"id":254},"_1-aplicações-que-atualizam-sozinhas","1. Aplicações que Atualizam Sozinhas",[208,257,258],{},"Muitos programas para Windows verificam e descarregam atualizações sempre que detetam ligação à Internet. Numa rede de casa isso passa despercebido. Num hotspot com um pacote de dados limitado, uma única atualização pode gastar centenas de megabytes sem pedir autorização.",[252,260,262],{"id":261},"_2-o-windows-não-tem-uma-forma-simples-de-resolver-isto","2. O Windows Não Tem uma Forma Simples de Resolver Isto",[208,264,265,266,269],{},"O Windows tem a opção de ",[212,267,268],{},"ligação com tráfego limitado",", que trava algumas transferências do próprio sistema. Mas muitas aplicações de terceiros simplesmente a ignoram.",[208,271,272,273,276],{},"A solução \"oficial\" é a ",[212,274,275],{},"Firewall do Windows Defender com Segurança Avançada",". Funciona, mas obriga a abrir uma consola técnica, percorrer um assistente com vários passos, escolher o programa, o tipo de regra, os perfis de rede… e repetir tudo para cada aplicação. Para desfazer, é preciso encontrar a regra certa no meio de centenas de outras.",[252,278,280],{"id":279},"_3-programas-de-terceiros-complicados-ou-pagos","3. Programas de Terceiros Complicados ou Pagos",[208,282,283,284,230],{},"As alternativas que encontrei eram firewalls completas, cheias de opções avançadas, pagas, com anúncios, ou que instalam controladores e serviços próprios. Eu só queria uma coisa: ",[212,285,286],{},"escolher que apps podem usar a Internet",[244,288],{},[247,290,292],{"id":291},"a-solução","A Solução",[208,294,295,296,298,299,302,303,306],{},"O ",[212,297,225],{}," mostra as aplicações instaladas no computador e, ao lado de cada uma, um interruptor: ",[212,300,301],{},"Permitido"," ou ",[212,304,305],{},"Bloqueado",". Um clique e a aplicação deixa de conseguir aceder à Internet. Outro clique e volta ao normal.",[208,308,309,310,313],{},"Por baixo, o Ofuzah usa a própria ",[212,311,312],{},"Windows Defender Firewall",", que já vem com o Windows. Não instala controladores, não cria serviços permanentes e não substitui a firewall do sistema. Apenas cria, de forma organizada, as regras que teria de criar à mão.",[208,315,316,317,320,321,324],{},"O app foi desenvolvido com ",[212,318,319],{},".NET"," e ",[212,322,323],{},"WPF",", com uma interface pensada para se parecer com uma aplicação nativa do Windows 11.",[244,326],{},[244,328],{},[330,331,333],"h1",{"id":332},"recursos-do-app","Recursos do App",[247,335,337],{"id":336},"_1-lista-de-aplicações-instaladas","1. Lista de Aplicações Instaladas",[208,339,340,341,344,345,348,349,353],{},"O Ofuzah procura automaticamente as aplicações no ",[212,342,343],{},"menu Iniciar",", nos ",[212,346,347],{},"programas instalados"," e nas pastas habituais como ",[350,351,352],"em",{},"Program Files",". Para cada uma mostra o ícone, o nome, o caminho, a editora e o estado atual.",[355,356,357,364,370],"ul",{},[358,359,360,363],"li",{},[212,361,362],{},"Pesquisa instantânea"," por nome ou caminho.",[358,365,366,369],{},[212,367,368],{},"Filtros:"," todas, permitidas, bloqueadas, adicionadas por si ou com estado desconhecido.",[358,371,372,375,376,230],{},[212,373,374],{},"Adicionar aplicação:"," se um programa não aparecer na lista, basta escolher o ficheiro ",[377,378,379],"code",{},".exe",[247,381,383],{"id":382},"_2-bloqueio-com-um-clique","2. Bloqueio com Um Clique",[208,385,386],{},"Ao desligar o interruptor, o Ofuzah cria uma regra de saída na Firewall que impede essa aplicação de iniciar ligações à Internet. Ao ligar de novo, remove a regra.",[208,388,389,390,393],{},"Antes de mostrar o novo estado, o Ofuzah ",[212,391,392],{},"volta a ler a Firewall para confirmar"," que a alteração foi mesmo aplicada. O que vê no ecrã corresponde ao que está realmente configurado.",[247,395,397],{"id":396},"_3-perfis-de-rede-bloquear-só-no-hotspot","3. Perfis de Rede: Bloquear Só no Hotspot",[208,399,400,401,404,405,302,408,411],{},"Esta é uma das funcionalidades de que mais gosto. O Windows classifica cada rede num de três perfis: ",[212,402,403],{},"Domínio",", ",[212,406,407],{},"Privado",[212,409,410],{},"Público",". No painel de detalhes de cada aplicação, pode escolher em que perfis o bloqueio se aplica.",[208,413,414,415,418,419,422,423,426],{},"Quando se liga ao hotspot do telemóvel, o Windows costuma tratá-lo como uma ",[212,416,417],{},"rede Pública",", enquanto a rede de casa fica normalmente como ",[212,420,421],{},"Privada",". Assim, pode bloquear uma aplicação ",[212,424,425],{},"apenas no perfil Público",": ela continua a atualizar-se à vontade em casa, mas fica sem Internet quando está a usar dados móveis.",[428,429,430],"blockquote",{},[208,431,432,433,436],{},"Dica: confirme como cada rede está classificada em ",[350,434,435],{},"Definições → Rede e Internet",". O perfil depende da escolha feita quando se ligou a essa rede pela primeira vez.",[247,438,440],{"id":439},"_4-painel-com-o-resumo-de-tudo","4. Painel com o Resumo de Tudo",[208,442,295,443,446],{},[212,444,445],{},"Painel"," mostra quantas aplicações foram detetadas, quantas estão bloqueadas, o estado da Firewall em cada perfil de rede e as últimas alterações feitas.",[208,448,237,449],{"align":236},[239,450],{"src":451,"alt":452},"https://raw.githubusercontent.com/teldio/ofuzah-releases/main/screenshots/pt-painel.png","Painel do Ofuzah com o resumo de aplicações e o estado da Firewall",[247,454,456],{"id":455},"_5-estado-real-e-avisos-honestos","5. Estado Real e Avisos Honestos",[208,458,459],{},"O Ofuzah não se limita a dizer \"bloqueado\" ou \"permitido\". Também avisa quando algo pode interferir:",[355,461,462,469,476,483],{},[358,463,464,465,468],{},"A Firewall está ",[212,466,467],{},"desativada"," num perfil de rede;",[358,470,471,472,475],{},"Existe uma ",[212,473,474],{},"regra de outro programa"," que já bloqueia ou permite a aplicação;",[358,477,478,479,482],{},"Uma ",[212,480,481],{},"política da empresa"," se sobrepõe às regras locais;",[358,484,485,486,230],{},"O executável foi ",[212,487,488],{},"removido ou mudou de pasta",[247,490,492],{"id":491},"_6-gestão-de-regras-e-histórico","6. Gestão de Regras e Histórico",[355,494,495,502,508],{},[358,496,497,498,501],{},"A página ",[212,499,500],{},"Regras de Firewall"," lista todas as regras criadas pelo Ofuzah, que pode remover uma a uma ou todas de uma vez.",[358,503,504,505],{},"As regras de outros programas aparecem apenas para consulta. ",[212,506,507],{},"O Ofuzah nunca as altera.",[358,509,295,510,513,514,230],{},[212,511,512],{},"Histórico"," regista cada operação (data, aplicação, resultado) e pode ser exportado para ",[212,515,516],{},"CSV",[208,518,237,519],{"align":236},[239,520],{"src":521,"alt":522},"https://raw.githubusercontent.com/teldio/ofuzah-releases/main/screenshots/pt-regras.png","Página de regras de Firewall do Ofuzah",[247,524,526],{"id":525},"_7-seguro-por-desenho","7. Seguro por Desenho",[208,528,529],{},"Mexer na Firewall exige privilégios de administrador. Por isso:",[355,531,532,538,549,555,562],{},[358,533,534,535,230],{},"A interface do Ofuzah funciona ",[212,536,537],{},"sem privilégios de administrador",[358,539,540,541,544,545,548],{},"Cada alteração passa por um ",[212,542,543],{},"assistente separado",", que só arranca depois de confirmar o pedido do ",[212,546,547],{},"Controlo de Conta de Utilizador (UAC)"," do Windows.",[358,550,551,552,230],{},"O Ofuzah ",[212,553,554],{},"nunca pede a sua palavra-passe",[358,556,557,558,561],{},"Só mexe nas ",[212,559,560],{},"suas próprias regras"," (todas do grupo «Ofuzah»).",[358,563,564,565,568],{},"Ao desinstalar, ",[212,566,567],{},"pergunta-lhe"," se quer remover as regras que criou.",[247,570,572],{"id":571},"_8-detalhes-que-fazem-diferença","8. Detalhes que Fazem Diferença",[355,574,575,581,587,593],{},[358,576,577,580],{},[212,578,579],{},"Tema claro e escuro",";",[358,582,583,586],{},[212,584,585],{},"Português e inglês",", com troca imediata nas configurações;",[358,588,589,592],{},[212,590,591],{},"Navegação por teclado"," e suporte para leitores de ecrã;",[358,594,595,596,599],{},"Opção para ",[212,597,598],{},"iniciar com o Windows"," (desligada por predefinição).",[244,601],{},[330,603,605],{"id":604},"uma-limitação-que-prefiro-explicar","Uma Limitação que Prefiro Explicar",[208,607,608,609,612,613,616],{},"O Ofuzah bloqueia ",[212,610,611],{},"executáveis individuais",". Algumas aplicações, sobretudo navegadores, jogos e programas com atualizadores, usam ",[212,614,615],{},"vários processos ou serviços"," para comunicar. Se bloquear apenas o executável principal, o atualizador pode continuar a funcionar.",[208,618,619,620,302,623,626],{},"Nesses casos, procure na lista os outros executáveis da mesma aplicação (por exemplo, os que têm ",[350,621,622],{},"update",[350,624,625],{},"helper"," no nome) e bloqueie-os também.",[244,628],{},[330,630,632],{"id":631},"grátis-sem-anúncios-e-privado","Grátis, Sem Anúncios e Privado",[208,634,295,635,638],{},[212,636,637],{},"Ofuzah é totalmente gratuito e não tem anúncios",". Não há versão \"Premium\" nem funcionalidades bloqueadas.",[355,640,641,646,652,658],{},[358,642,643],{},[212,644,645],{},"Não precisa de criar conta.",[358,647,648,651],{},[212,649,650],{},"Funciona offline."," Não envia dados para nenhum servidor e não tem telemetria.",[358,653,654,657],{},[212,655,656],{},"Não captura nem analisa o seu tráfego."," Apenas gere regras da Firewall.",[358,659,660,661,230],{},"O histórico e as definições ficam ",[212,662,663],{},"apenas no seu computador",[208,665,666],{},"Faria pouco sentido um app para poupar dados móveis andar ele próprio a gastá-los.",[244,668],{},[330,670,672],{"id":671},"onde-descarregar","Onde Descarregar",[208,674,675,676,679],{},"O Ofuzah está disponível para ",[212,677,678],{},"Windows 10 (versão 1809 ou posterior) e Windows 11, 64 bits",". Não é preciso instalar mais nada.",[355,681,682],{},[358,683,684,687,688],{},[212,685,686],{},"Windows:"," ",[689,690,694],"a",{"href":691,"rel":692},"https://github.com/teldio/ofuzah-releases/releases/latest",[693],"nofollow","Transferir no GitHub",[428,696,697],{},[208,698,699,702,703,706],{},[212,700,701],{},"Nota:"," o instalador ainda não está assinado digitalmente, por isso o Windows SmartScreen pode mostrar o aviso «O Windows protegeu o seu PC». Para continuar, clique em ",[212,704,705],{},"Mais informações → Executar mesmo assim",". Em cada versão publico o código SHA-256 do instalador para que possa confirmar que o ficheiro não foi alterado.",[330,708,710],{"id":709},"minha-conclusão","Minha Conclusão",[208,712,713,714,230],{},"O Ofuzah nasceu de um problema bem real, ver os dados móveis desaparecer por causa de aplicações que eu nem estava a usar. O Windows já tem tudo o que é preciso para resolver isto, mas escondido atrás de uma consola técnica. O Ofuzah só torna isso ",[212,715,716],{},"simples e prático",[208,718,719],{},"Se também trabalha muitas vezes com o hotspot do telemóvel, ou simplesmente quer decidir que programas podem falar com a Internet, experimente. E se tiver sugestões ou encontrar algum problema, deixe a sua opinião: é isso que me ajuda a melhorar o app.",[208,721,724,728],{"align":722,"style":723},"right","font-size: 12px;",[725,726,727],"i",{}," texto aprimorado por IA","🤖",{"title":730,"searchDepth":731,"depth":731,"links":732},"",2,[733,739,740,741,742,743,744,745,746,747],{"id":249,"depth":731,"text":250,"children":734},[735,737,738],{"id":254,"depth":736,"text":255},3,{"id":261,"depth":736,"text":262},{"id":279,"depth":736,"text":280},{"id":291,"depth":731,"text":292},{"id":336,"depth":731,"text":337},{"id":382,"depth":731,"text":383},{"id":396,"depth":731,"text":397},{"id":439,"depth":731,"text":440},{"id":455,"depth":731,"text":456},{"id":491,"depth":731,"text":492},{"id":525,"depth":731,"text":526},{"id":571,"depth":731,"text":572},"2026-10-16T00:00:00.000Z","Conheça o Ofuzah, um app grátis para Windows que permite bloquear ou permitir o acesso à Internet de cada aplicação, ideal para poupar dados móveis quando usa o hotspot do telemóvel.","md","/ofuzah.webp",{},7,{"title":14,"description":749},"k2uFH8NMjjwR9i1NLulrpVw4YnCp6oeJAXzGio6NoDI",{"id":757,"title":18,"author":758,"body":760,"date":1144,"description":1145,"extension":750,"image":1146,"meta":1147,"minRead":1148,"navigation":182,"path":19,"seo":1149,"stem":20,"__hash__":1150},"blog/blog/qrcode-scanner.md",{"name":201,"avatar":759},{"src":203,"alt":201},{"type":205,"value":761,"toc":1128},[762,773,784,787,789,793,797,800,804,807,811,814,818,821,823,827,835,851,853,855,857,861,864,878,881,885,892,906,912,916,923,943,950,954,965,983,987,990,1009,1016,1020,1030,1034,1054,1056,1058,1065,1068,1086,1089,1091,1093,1111,1113,1116,1121,1124],[208,763,764,765,768,769,772],{},"Ler um ",[212,766,767],{},"QR Code"," devia ser a coisa mais simples do mundo: apontar a câmara, ver o conteúdo, seguir em frente. Mas quem já procurou um leitor na Play Store ou na App Store sabe que a realidade é outra. A maioria dos apps gratuitos está cheia de ",[212,770,771],{},"anúncios em ecrã inteiro",", banners que tapam a câmara, pedidos de subscrição e permissões que não fazem sentido nenhum para um simples leitor.",[208,774,775,776,779,780,783],{},"Foi por isso que criei o ",[212,777,778],{},"QR Code Scanner",": um leitor de QR Codes e códigos de barras ",[212,781,782],{},"100% grátis, sem anúncios"," e focado apenas em fazer bem o seu trabalho.",[208,785,786],{},"Neste artigo, apresento o app, os seus recursos e o porquê de ter decidido mantê-lo livre de publicidade.",[244,788],{},[247,790,792],{"id":791},"o-problema-dos-leitores-grátis","O Problema dos Leitores \"Grátis\"",[252,794,796],{"id":795},"_1-anúncios-em-todo-o-lado","1. Anúncios em Todo o Lado",[208,798,799],{},"Em muitos leitores, cada leitura vem acompanhada de um anúncio. Às vezes é preciso esperar alguns segundos, ou encontrar um \"X\" minúsculo, só para ver o conteúdo de um código que já foi lido.",[252,801,803],{"id":802},"_2-permissões-exageradas","2. Permissões Exageradas",[208,805,806],{},"Um leitor de QR Codes precisa da câmara. Não precisa da sua localização, dos seus contactos nem de acesso permanente à internet para lhe mostrar publicidade.",[252,808,810],{"id":809},"_3-dados-enviados-para-terceiros","3. Dados Enviados para Terceiros",[208,812,813],{},"Os códigos que lemos dizem muito sobre nós: os sites que visitamos, as redes Wi-Fi a que nos ligamos, os produtos que compramos. Em apps sustentados por publicidade, essa informação tem valor comercial.",[252,815,817],{"id":816},"_4-interfaces-confusas","4. Interfaces Confusas",[208,819,820],{},"Menus escondidos, botões de \"Premium\" em destaque e ecrãs carregados tornam uma tarefa de dois segundos numa experiência frustrante.",[244,822],{},[247,824,826],{"id":825},"a-solução-qr-code-scanner","A Solução: QR Code Scanner",[208,828,295,829,831,832],{},[212,830,778],{}," foi pensado para ser o oposto disso tudo. Abre direto na câmara, lê o código e mostra o resultado. ",[212,833,834],{},"Sem anúncios, sem conta, sem pagamentos.",[208,836,316,837,320,840,843,844,847,848,230],{},[212,838,839],{},"Expo",[212,841,842],{},"React Native",", por isso funciona de forma nativa tanto em ",[212,845,846],{},"Android"," como em ",[212,849,850],{},"iOS",[244,852],{},[244,854],{},[330,856,333],{"id":332},[247,858,860],{"id":859},"_1-dois-modos-de-leitura","1. Dois Modos de Leitura",[208,862,863],{},"No topo do ecrã, pode alternar entre dois modos, consoante o que pretende ler:",[355,865,866,872],{},[358,867,868,871],{},[212,869,870],{},"QR Code:"," lê QR Codes, Data Matrix, Aztec e PDF417.",[358,873,874,877],{},[212,875,876],{},"Código de Barras:"," lê EAN-13, EAN-8, UPC-A, UPC-E, Code 128, Code 39, Code 93, ITF-14 e Codabar, os formatos que encontramos em produtos de supermercado, livros, caixas e etiquetas.",[208,879,880],{},"Separar os modos torna a leitura mais rápida e evita que a câmara apanhe o código errado quando há vários por perto.",[247,882,884],{"id":883},"_2-leitura-a-partir-da-galeria","2. Leitura a Partir da Galeria",[208,886,887,888,891],{},"Recebeu um QR Code numa imagem pelo WhatsApp? Tirou um print de um código? Não precisa de outro telemóvel para o ler. Basta tocar em ",[212,889,890],{},"\"Da galeria\"",", escolher a foto, e o app procura o código na imagem.",[355,893,894,900],{},[358,895,896,897,899],{},"No ",[212,898,846],{},", lê todos os formatos suportados.",[358,901,896,902,905],{},[212,903,904],{},"iPhone",", lê QR Codes (limitação do próprio sistema iOS).",[208,907,908,909,230],{},"E tudo isto funciona ",[212,910,911],{},"offline",[247,913,915],{"id":914},"_3-resultado-claro-e-fácil-de-copiar","3. Resultado Claro e Fácil de Copiar",[208,917,918,919,922],{},"Quando um código é detetado, o resultado aparece numa ",[212,920,921],{},"folha inferior nativa"," com:",[355,924,925,934,937],{},[358,926,927,928,302,930,933],{},"O tipo de código lido (por exemplo, ",[350,929,767],{},[350,931,932],{},"EAN-13",");",[358,935,936],{},"O conteúdo completo, que pode ser selecionado;",[358,938,939,940,230],{},"Um botão para ",[212,941,942],{},"copiar para a área de transferência",[208,944,945,946,949],{},"O app ",[212,947,948],{},"não abre links automaticamente",". Mostra-lhe primeiro o conteúdo, para que possa decidir o que fazer com ele. É uma pequena proteção contra QR Codes maliciosos colados em locais públicos.",[247,951,953],{"id":952},"_4-histórico-de-leituras","4. Histórico de Leituras",[208,955,956,957,960,961,964],{},"Todas as leituras ficam guardadas num ",[212,958,959],{},"histórico local",", com as ",[212,962,963],{},"últimas 100 leituras"," organizadas por data (\"Hoje\", \"Ontem\", etc.).",[355,966,967,970,977],{},[358,968,969],{},"Se ler de novo um código que já está no histórico, ele passa para o topo da lista em vez de ficar duplicado.",[358,971,972,973,976],{},"Pode ",[212,974,975],{},"limpar o histórico"," a qualquer momento.",[358,978,979,980,230],{},"O histórico fica guardado ",[212,981,982],{},"apenas no seu dispositivo",[247,984,986],{"id":985},"_5-controlos-da-câmara","5. Controlos da Câmara",[208,988,989],{},"Para os códigos mais difíceis de ler:",[355,991,992,998,1004],{},[358,993,994,997],{},[212,995,996],{},"Lanterna"," para ambientes com pouca luz;",[358,999,1000,1003],{},[212,1001,1002],{},"Zoom"," de 1x, 2x e 3x para códigos pequenos ou distantes;",[358,1005,1006,230],{},[212,1007,1008],{},"Troca entre câmara traseira e frontal",[208,1010,1011,1012,1015],{},"Também é possível ",[212,1013,1014],{},"pausar a leitura"," e retomá-la com um toque.",[247,1017,1019],{"id":1018},"_6-português-e-inglês","6. Português e Inglês",[208,1021,1022,1023,320,1026,1029],{},"O app usa automaticamente o idioma do seu telemóvel, mas pode trocar entre ",[212,1024,1025],{},"português",[212,1027,1028],{},"inglês"," diretamente no app, sem ir às definições do sistema.",[247,1031,1033],{"id":1032},"_7-detalhes-que-fazem-diferença","7. Detalhes que Fazem Diferença",[355,1035,1036,1042,1048],{},[358,1037,1038,1041],{},[212,1039,1040],{},"Vibração (feedback háptico)"," quando um código é detetado;",[358,1043,1044,1047],{},[212,1045,1046],{},"Animações suaves"," que respeitam a opção \"reduzir movimento\" do sistema, para quem é sensível a animações;",[358,1049,1050,1053],{},[212,1051,1052],{},"Tema escuro",", confortável para os olhos e para a bateria.",[244,1055],{},[330,1057,632],{"id":631},[208,1059,1060,1061,1064],{},"Este é o ponto mais importante: o ",[212,1062,1063],{},"QR Code Scanner é totalmente gratuito e não tem anúncios",". Não há versão \"Premium\", não há funcionalidades bloqueadas e não há publicidade escondida.",[208,1066,1067],{},"Além disso:",[355,1069,1070,1074,1080],{},[358,1071,1072],{},[212,1073,645],{},[358,1075,1076,1079],{},[212,1077,1078],{},"Não faz pedidos à internet."," O app não envia os seus dados para nenhum servidor.",[358,1081,1082,1085],{},[212,1083,1084],{},"Só pede as permissões necessárias:"," a câmara, para ler códigos, e o acesso às fotos, apenas quando escolhe ler a partir da galeria.",[208,1087,1088],{},"Os códigos que lê são seus e ficam no seu telemóvel.",[244,1090],{},[330,1092,672],{"id":671},[355,1094,1095,1103],{},[358,1096,1097,687,1100],{},[212,1098,1099],{},"Android:",[689,1101,1102],{"href":64},"Google Play Store",[358,1104,1105,687,1108],{},[212,1106,1107],{},"iOS:",[689,1109,1110],{"href":64},"App Store",[330,1112,710],{"id":709},[208,1114,1115],{},"Nem todas as ferramentas precisam de ser um negócio. Um leitor de QR Codes é algo que usamos no dia a dia, em restaurantes, lojas, eventos ou para partilhar uma rede Wi-Fi, e merece ser simples, rápido e respeitar quem o usa.",[208,1117,295,1118,1120],{},[212,1119,778],{}," nasceu dessa ideia: fazer uma coisa e fazê-la bem, sem distrações e sem anúncios.",[208,1122,1123],{},"Se experimentar o app, deixe a sua opinião. O feedback de quem o usa é o que me ajuda a melhorá-lo.",[208,1125,1126,728],{"align":722,"style":723},[725,1127,727],{},{"title":730,"searchDepth":731,"depth":731,"links":1129},[1130,1136,1137,1138,1139,1140,1141,1142,1143],{"id":791,"depth":731,"text":792,"children":1131},[1132,1133,1134,1135],{"id":795,"depth":736,"text":796},{"id":802,"depth":736,"text":803},{"id":809,"depth":736,"text":810},{"id":816,"depth":736,"text":817},{"id":825,"depth":731,"text":826},{"id":859,"depth":731,"text":860},{"id":883,"depth":731,"text":884},{"id":914,"depth":731,"text":915},{"id":952,"depth":731,"text":953},{"id":985,"depth":731,"text":986},{"id":1018,"depth":731,"text":1019},{"id":1032,"depth":731,"text":1033},"2026-10-14T00:00:00.000Z","Conheça o QR Code Scanner, um app para Android e iOS que lê QR Codes e códigos de barras sem anúncios, sem conta e sem enviar os seus dados para lado nenhum.","/qrcode-scanner.webp",{},6,{"title":18,"description":1145},"z4X2QeZwgl3wTKTA2Od1IbSRi1d9OizPn2mASgzxd30",{"id":1152,"title":10,"author":1153,"body":1155,"date":1661,"description":1662,"extension":750,"image":1663,"meta":1664,"minRead":1470,"navigation":182,"path":11,"seo":1665,"stem":12,"__hash__":1666},"blog/blog/mpesa-api-starter.md",{"name":201,"avatar":1154},{"src":203,"alt":201},{"type":205,"value":1156,"toc":1647},[1157,1168,1179,1181,1185,1189,1200,1209,1213,1227,1231,1250,1254,1268,1270,1274,1281,1295,1297,1299,1303,1307,1310,1343,1346,1350,1353,1366,1370,1382,1539,1543,1546,1561,1573,1576,1579,1583,1589,1592,1600,1618,1623,1630,1633,1636,1639,1643],[208,1158,1159,1160,1163,1164,1167],{},"A integração com ",[212,1161,1162],{},"APIs de pagamento",", especialmente a do ",[212,1165,1166],{},"M-Pesa",", é uma das etapas mais desafiadoras para muitos programadores iniciantes em Moçambique. Embora a documentação do serviço ofereça uma visão geral, a implementação prática muitas vezes se transforma num verdadeiro teste de paciência — entre certificados SSL, chaves públicas e privadas, endpoints inconsistentes e autenticações complexas.",[208,1169,1170,1171,1174,1175,1178],{},"Neste artigo, partilho uma análise sincera sobre essas dificuldades e apresento uma ",[212,1172,1173],{},"solução prática",": um ",[212,1176,1177],{},"backend M-Pesa já pronto para uso",", que qualquer desenvolvedor pode clonar do GitHub e fazer deploy em minutos, utilizando apenas as suas próprias variáveis de ambiente obtidas no portal do desenvolvedor da M-Pesa.",[244,1180],{},[247,1182,1184],{"id":1183},"as-principais-dificuldades-dos-iniciantes","As Principais Dificuldades dos Iniciantes",[252,1186,1188],{"id":1187},"_1-documentação-incompleta-ou-confusa","1. Documentação Incompleta ou Confusa",[208,1190,1191,1192,1195,1196,1199],{},"Muitos desenvolvedores relatam que a ",[212,1193,1194],{},"documentação oficial da API M-Pesa"," (fornecida pela Vodacom Moçambique) é pouco detalhada, principalmente em relação a exemplos de código prático.",[1197,1198],"br",{},"\nIsso leva os iniciantes a cometer erros simples, como formatar mal as requisições ou usar endpoints incorretos.",[428,1201,1202],{},[208,1203,1204,1205,1208],{},"“Passei dias a tentar entender porque minha requisição devolvia ",[350,1206,1207],{},"403 Forbidden",", e o problema era apenas o cabeçalho mal formatado.” — Desenvolvedor júnior de Maputo",[252,1210,1212],{"id":1211},"_2-dificuldade-em-configurar-o-ssl","2. Dificuldade em Configurar o SSL",[208,1214,1215,1216,1219,1220,1222,1223,1226],{},"Embora o ambiente ",[212,1217,1218],{},"sandbox"," permita testes sem SSL, o ambiente de produção exige certificados válidos.",[1197,1221],{},"\nPara quem está a trabalhar localmente ou num ambiente gratuito, como o ",[212,1224,1225],{},"Vercel",", configurar HTTPS pode ser uma dor de cabeça.",[252,1228,1230],{"id":1229},"_3-autenticação-e-chaves-criptográficas","3. Autenticação e Chaves Criptográficas",[208,1232,1233,1234,1237,1238,404,1241,320,1244,230,1247,1249],{},"O M-Pesa utiliza ",[212,1235,1236],{},"autenticação baseada em chaves públicas e privadas",", o que exige que o programador entenda bem conceitos de ",[212,1239,1240],{},"criptografia RSA",[212,1242,1243],{},"assinaturas digitais",[212,1245,1246],{},"segurança de API",[1197,1248],{},"\nEsses temas são raramente abordados nos cursos iniciais de programação disponíveis em Moçambique, o que gera frustração.",[252,1251,1253],{"id":1252},"_4-ausência-de-exemplos-em-typescriptnodejs","4. Ausência de Exemplos em TypeScript/Node.js",[208,1255,1256,1257,1260,1261,1263,1264,1267],{},"Grande parte dos exemplos disponíveis online está em ",[212,1258,1259],{},"PHP ou Java",", linguagens mais antigas no ecossistema local.",[1197,1262],{},"\nEntretanto, o novo mercado — dominado por ",[212,1265,1266],{},"Node.js, React, Next.js e Vite"," — exige soluções modernas e fáceis de integrar ao frontend.",[244,1269],{},[247,1271,1273],{"id":1272},"a-solução-backend-m-pesa-pronto-para-deploy","A Solução: Backend M-Pesa Pronto para Deploy",[208,1275,1276,1277,1280],{},"Pensando nesses desafios, preparei um ",[212,1278,1279],{},"backend completo e funcional",", pronto para ser usado por qualquer desenvolvedor que queira integrar pagamentos via M-Pesa com rapidez e segurança.",[208,1282,1283,1284,1287,1288,1291,1292,1294],{},"Esse projeto foi criado com ",[212,1285,1286],{},"NextJS",", e pode ser ",[212,1289,1290],{},"implantado gratuitamente na Vercel"," com apenas alguns cliques.",[1197,1293],{},"\nO código está hospedado no GitHub, e basta clonar o repositório e definir as variáveis de ambiente.",[244,1296],{},[244,1298],{},[330,1300,1302],{"id":1301},"passos-para-criar-seu-próprio-backend","Passos para criar seu próprio backend",[247,1304,1306],{"id":1305},"_1-clonar-o-repositório","1. Clonar o Repositório",[208,1308,1309],{},"Acesse o repositório no GitHub e clone-o para o seu computador:",[1311,1312,1316],"pre",{"className":1313,"code":1314,"language":1315,"meta":730,"style":730},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","git clone https://github.com/calbedev/mpesa-api-starter.git\ncd mpesa-backend-ready\n","bash",[377,1317,1318,1334],{"__ignoreMap":730},[1319,1320,1323,1327,1331],"span",{"class":1321,"line":1322},"line",1,[1319,1324,1326],{"class":1325},"sBMFI","git",[1319,1328,1330],{"class":1329},"sfazB"," clone",[1319,1332,1333],{"class":1329}," https://github.com/calbedev/mpesa-api-starter.git\n",[1319,1335,1336,1340],{"class":1321,"line":731},[1319,1337,1339],{"class":1338},"s2Zo4","cd",[1319,1341,1342],{"class":1329}," mpesa-backend-ready\n",[208,1344,1345],{},"Se preferir, pode também fazer o fork e trabalhar na sua própria versão.",[247,1347,1349],{"id":1348},"_2-instalar-dependências","2. Instalar Dependências",[208,1351,1352],{},"No diretório do projeto, instale as dependências necessárias:",[1311,1354,1356],{"className":1313,"code":1355,"language":1315,"meta":730,"style":730},"pnpm install\n",[377,1357,1358],{"__ignoreMap":730},[1319,1359,1360,1363],{"class":1321,"line":1322},[1319,1361,1362],{"class":1325},"pnpm",[1319,1364,1365],{"class":1329}," install\n",[247,1367,1369],{"id":1368},"_3-definir-as-variáveis-de-ambiente","3. Definir as variáveis de ambiente",[208,1371,1372,1373,1376,1377,230],{},"Crie um ficheiro ",[377,1374,1375],{},".env"," e defina as seguintes variáveis, obtidas no ",[689,1378,1381],{"href":1379,"rel":1380},"https://developer.mpesa.vm.co.mz/",[693],"portal do desenvolvedor M-Pesa",[1311,1383,1385],{"className":1313,"code":1384,"language":1315,"meta":730,"style":730},"# M-Pesa API Configuration (OBRIGATÓRIO)\nMPESA_API_KEY=\"sua api key\"\nMPESA_PUBLIC_KEY= \"Sua public key\"\nMPESA_API_URL=api.sandbox.vm.co.mz \nMPESA_USE_SSL=false\n\n# API Security (OBRIGATÓRIO)\n# Defina uma chave secreta forte para proteger suas APIs\n# Esta chave será usada para autenticar requisições do frontend\nAPI_SECRET_KEY=\"defina uma chave secreta\"\n\n# Service Provider Configuration (OPCIONAL mas recomendado)\n# Necessário para operações B2B, B2C e Reversal\nMPESA_SERVICE_PROVIDER_CODE=171717\nMPESA_INITIATOR_IDENTIFIER=MPesa2018\nMPESA_SECURITY_CREDENTIAL=Mpesa2019\n",[377,1386,1387,1393,1412,1427,1441,1452,1457,1462,1468,1474,1489,1494,1500,1506,1517,1528],{"__ignoreMap":730},[1319,1388,1389],{"class":1321,"line":1322},[1319,1390,1392],{"class":1391},"sHwdD","# M-Pesa API Configuration (OBRIGATÓRIO)\n",[1319,1394,1395,1399,1403,1406,1409],{"class":1321,"line":731},[1319,1396,1398],{"class":1397},"sTEyZ","MPESA_API_KEY",[1319,1400,1402],{"class":1401},"sMK4o","=",[1319,1404,1405],{"class":1401},"\"",[1319,1407,1408],{"class":1329},"sua api key",[1319,1410,1411],{"class":1401},"\"\n",[1319,1413,1414,1417,1419,1422,1425],{"class":1321,"line":736},[1319,1415,1416],{"class":1397},"MPESA_PUBLIC_KEY",[1319,1418,1402],{"class":1401},[1319,1420,1421],{"class":1401}," \"",[1319,1423,1424],{"class":1329},"Sua public key",[1319,1426,1411],{"class":1401},[1319,1428,1430,1433,1435,1438],{"class":1321,"line":1429},4,[1319,1431,1432],{"class":1397},"MPESA_API_URL",[1319,1434,1402],{"class":1401},[1319,1436,1437],{"class":1329},"api.sandbox.vm.co.mz",[1319,1439,1440],{"class":1397}," \n",[1319,1442,1444,1447,1449],{"class":1321,"line":1443},5,[1319,1445,1446],{"class":1397},"MPESA_USE_SSL",[1319,1448,1402],{"class":1401},[1319,1450,1451],{"class":1329},"false\n",[1319,1453,1454],{"class":1321,"line":1148},[1319,1455,1456],{"emptyLinePlaceholder":182},"\n",[1319,1458,1459],{"class":1321,"line":753},[1319,1460,1461],{"class":1391},"# API Security (OBRIGATÓRIO)\n",[1319,1463,1465],{"class":1321,"line":1464},8,[1319,1466,1467],{"class":1391},"# Defina uma chave secreta forte para proteger suas APIs\n",[1319,1469,1471],{"class":1321,"line":1470},9,[1319,1472,1473],{"class":1391},"# Esta chave será usada para autenticar requisições do frontend\n",[1319,1475,1477,1480,1482,1484,1487],{"class":1321,"line":1476},10,[1319,1478,1479],{"class":1397},"API_SECRET_KEY",[1319,1481,1402],{"class":1401},[1319,1483,1405],{"class":1401},[1319,1485,1486],{"class":1329},"defina uma chave secreta",[1319,1488,1411],{"class":1401},[1319,1490,1492],{"class":1321,"line":1491},11,[1319,1493,1456],{"emptyLinePlaceholder":182},[1319,1495,1497],{"class":1321,"line":1496},12,[1319,1498,1499],{"class":1391},"# Service Provider Configuration (OPCIONAL mas recomendado)\n",[1319,1501,1503],{"class":1321,"line":1502},13,[1319,1504,1505],{"class":1391},"# Necessário para operações B2B, B2C e Reversal\n",[1319,1507,1509,1512,1514],{"class":1321,"line":1508},14,[1319,1510,1511],{"class":1397},"MPESA_SERVICE_PROVIDER_CODE",[1319,1513,1402],{"class":1401},[1319,1515,1516],{"class":1329},"171717\n",[1319,1518,1520,1523,1525],{"class":1321,"line":1519},15,[1319,1521,1522],{"class":1397},"MPESA_INITIATOR_IDENTIFIER",[1319,1524,1402],{"class":1401},[1319,1526,1527],{"class":1329},"MPesa2018\n",[1319,1529,1531,1534,1536],{"class":1321,"line":1530},16,[1319,1532,1533],{"class":1397},"MPESA_SECURITY_CREDENTIAL",[1319,1535,1402],{"class":1401},[1319,1537,1538],{"class":1329},"Mpesa2019\n",[247,1540,1542],{"id":1541},"_4-testar-localmente","4. Testar localmente",[208,1544,1545],{},"Antes de fazer o deploy, teste o projeto no seu ambiente local:",[1311,1547,1549],{"className":1313,"code":1548,"language":1315,"meta":730,"style":730},"pnpm run dev\n",[377,1550,1551],{"__ignoreMap":730},[1319,1552,1553,1555,1558],{"class":1321,"line":1322},[1319,1554,1362],{"class":1325},[1319,1556,1557],{"class":1329}," run",[1319,1559,1560],{"class":1329}," dev\n",[208,1562,1563,1564,1568,1569],{},"Acesse ",[689,1565,1566],{"href":1566,"rel":1567},"http://localhost:3000",[693],", se tudo estiver configurado corretamente, o status da api estará ok, como na imagem abaixo:\n",[239,1570],{"alt":1571,"src":1572},"Status da API","/status.jpeg",[208,1574,1575],{},"Acesse as página de testes para fazer os testes de todas as funcionalidades com formulários intuitivos e visualização de respostas em tempo real.",[208,1577,1578],{},"Acesse a página da documentação para aprender como integrar as APIs no seu frontend com exemplos práticos e detalhados.",[247,1580,1582],{"id":1581},"_5-fazer-deploy-na-vercel","5. Fazer Deploy na Vercel",[1584,1585,1586],"ol",{},[358,1587,1588],{},"Crie uma conta em vercel.com",[208,1590,1591],{},"Clique em “Add New Project” → “Import Git Repository”.",[1584,1593,1594,1597],{"start":731},[358,1595,1596],{},"Escolha o repositório clonado no GitHub.",[358,1598,1599],{},"Configure as variáveis de ambiente na aba Environment Variables:",[355,1601,1602,1604,1606,1608,1610,1612,1614,1616],{},[358,1603,1398],{},[358,1605,1416],{},[358,1607,1432],{},[358,1609,1446],{},[358,1611,1479],{},[358,1613,1511],{},[358,1615,1522],{},[358,1617,1533],{},[1584,1619,1620],{"start":1443},[358,1621,1622],{},"Clique em Deploy.",[208,1624,1625,1626],{},"Em menos de 2 minutos, a Vercel compila e coloca o seu backend online com um domínio gratuito como:\n",[689,1627,1628],{"href":1628,"rel":1629},"https://mpesa-backend-ready.vercel.app",[693],[330,1631,1632],{"id":709},"Minha conclusão",[208,1634,1635],{},"Criar um backend M-Pesa do zero pode parecer uma tarefa impossível no início, mas com as ferramentas certas, torna-se um processo acessível e educativo.\nCom este projeto pronto para deploy, qualquer iniciante pode colocar a sua API no ar em minutos — aprendendo, testando e evoluindo com segurança.",[208,1637,1638],{},"O futuro do desenvolvimento em Moçambique depende de acesso, partilha de conhecimento e colaboração.\nE este é apenas o primeiro passo para transformar ideias locais em soluções digitais reais.",[208,1640,1641,728],{"align":722,"style":723},[725,1642,727],{},[1644,1645,1646],"style",{},"html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}",{"title":730,"searchDepth":731,"depth":731,"links":1648},[1649,1655,1656,1657,1658,1659,1660],{"id":1183,"depth":731,"text":1184,"children":1650},[1651,1652,1653,1654],{"id":1187,"depth":736,"text":1188},{"id":1211,"depth":736,"text":1212},{"id":1229,"depth":736,"text":1230},{"id":1252,"depth":736,"text":1253},{"id":1272,"depth":731,"text":1273},{"id":1305,"depth":731,"text":1306},{"id":1348,"depth":731,"text":1349},{"id":1368,"depth":731,"text":1369},{"id":1541,"depth":731,"text":1542},{"id":1581,"depth":731,"text":1582},"2025-10-15T00:00:00.000Z","Um olhar realista sobre as dificuldades enfrentadas por desenvolvedores moçambicanos ao integrar a API do M-Pesa, e como um backend pronto para deploy na Vercel pode simplificar esse processo.","/mpesa-starter-api.png",{},{"title":10,"description":1662},"mwQRQMkpyUgT-r7pOSXrQ_kUoVJ9ft8SKtGtbf6vlZ4",1792227168349]