AstroLab banner

AstroLab

13 devlogs
18h 54m 2s

AstroLab is a living monorepo that documents my journey from a programming beginner to a Computer Engineering student. It serves as a central hub for my learning modules (focused on Python, with plans to grow into NodeJS), professional devlogs, an…

AstroLab is a living monorepo that documents my journey from a programming beginner to a Computer Engineering student. It serves as a central hub for my learning modules (focused on Python, with plans to grow into NodeJS), professional devlogs, and hands-on projects.
The project recently pivoted into AstroLab: a CLI-powered study tool that makes learning astronomy and physics more engaging by using real NASA data (Astronomy Picture of the Day - APOD) combined with Google Gemini to automatically generate interactive quizzes and themed flashcards. Perfect for productive study sessions “between lectures”.

This project uses AI

I use AI (Perplexity, Gemini CLI) as a “senior mentor” to guide my learning, review my code architecture, and explain complex concepts. I use AI strictly to accelerate my learning—never to generate code I don’t understand. Specifically, I use it to:

Plan the project architecture and directory structure (like this monorepo).

Debug specific errors in my Python scripts.

Generate documentation templates (READMEs, Devlogs) to maintain professional standards.

For the banner I AI-generated the backdrop of the image. Part with the computer and desk. The rest I edited in Canva

Acting as a partner programmer to refactor code according to PEP 8 standards. This speeds up my debugging and understanding. Perplexity is very good for web searches; it finds documentation, can see my public repo, that sort of thing.

Demo Repository

Loading README...

ChefThi

qjjf wlr

Attachment
0
ChefThi
  • fix(core): add NASA API fallback for 503 errors and clean up repo metadata (224f3ca)
  • fix(cli): resolve NameError by importing Table for health check (68d7342)

I spent these sessions making AstroLab more resilient. I don’t want the app to crash just because an API is having a bad day. The app needs to keep running no matter what.

NASA API Fallback:
I added a proper try-except block with a timeout=10 in nasa_client.py. Now, if NASA’s servers are down or slow, the system triggers a fallback mechanism and serves a cached entry (Carina Nebula) instead of just dying with a traceback. It’s about keeping the educational flow alive even offline.

CLI Fixes & Cleanup:
Caught a NameError in the CLI—I was trying to use the Table component from rich but forgot the import. Fixed that and bumped the version to 1.0.4. I also did some house cleaning, removing old meta-docs and updating the .gitignore to keep the repo lean and focused.

The logic is getting more hardened with every commit. Whether the API is up or down, AstroLab stays standing.

moonparrot

I really liked today’s APOD (“Eye on the Milky Way”). That small lagoon reflecting the stars and the Milky Way arching overhead is beautiful. It looks like a Martian eye gazing back at the cosmos. 🌌 (It's the second attach in this post)

Attachment
Attachment
Attachment
0
ChefThi
  • Revise project description for clarity (34ac15d)

I’m currently fixing a bug where the .env file refuses to load properly on Windows. It works fine on my Debian setup, but Windows is being picky with the file paths. I’m testing a fix using find_dotenv() to make sure the script locates the environment variables regardless of which folder it’s being called from.
I haven’t committed the .env file yet (obviously, security first), but I’m in the middle of refining the loading logic so it’s 100% cross-platform. I want this to be “plug and play” for anyone, whether they are on Linux, Termux, or Windows.

terminal

And this is my test n this session (the image below)

Attachment
Attachment
0
ChefThi
  • fix(core): ensure .env loads correctly on Windows and remove email from package metadata (79a57e3)
    to
  • fix(ux): improve offline mode messaging and clarify quiz fetching (85edc32)

I went into astrolab/quiz.py and changed the UX text. Instead of just “Fetching APOD”, it now explicitly tells the user why it’s doing that:
"Fetching today's NASA APOD data to use as study context for your quiz..."

It’s a tiny string change, but it completely fixes the mental model for the user. They now understand the quiz is dynamically generated from today’s picture.

I also toned down the terminal output colors and emojis a bit. Sometimes less is more when you want a tool to feel like a real developer utility rather than a toy.

I’m still checking, testing, and trying to make sure everything is working correctly and that there won’t be any errors in parts of the system/user experience.

Attachment
Attachment
0
ChefThi

I spent some time touching up the banner and getting everything ready for the reship. I wanted the visuals to match the effort I put into the code, so I gave the banner a bit more personality to move away from that generic look.

I also did a full pass on the project description and the AI declaration. I used Perplexity to help translate and to avoid making it too technical or too simple.


Timelapse:
editing more the banner

Attachment
0
ChefThi
  • build: package AstroLab for PyPI distribution 📦 (9a3782f)
  • ci: add automatic PyPI deployment with Trusted Publishing 🚀 (19e405e)

After shipping the MVP, I spent this session turning AstroLab into a proper pip package. It’s mostly infrastructure work, nothing fancy, but it makes the “factory” much easier to share.

Now you don’t even need to clone the repo anymore—just run pip install astrolab-cli and it’s ready. I restructured the project, created the pyproject.toml, and set up a GitHub Actions workflow with Trusted Publishing so the deployment to PyPI is fully automated.

I almost had a heart attack yesterday, though. I saw some people saying the Sidequest ended on the 30th, and since I committed the MVP on the 31st, I thought I’d missed the deadline by a day. I was so bummed out, thinking all that work on the bus was for nothing, until I found out they extended it to the end of the month. Talk about a close call.

This is my first pypi package 😎

python

For anyone who wants to use these images and emojis that I’ve been creating in the posts, just use the extension Spicetown available for Chrome and Firefox. It’s a Flavortown project, and I really liked it a lot

Used Gemini CLI to help with the pyproject.toml structure and keep the CI/CD syntax clea (Unfortunately, I don’t know about that part of deployment, CI/CD, and automatic updates)

Attachment
0
ChefThi

Shipped this project!

Hours: 16.33
Cookies: 🍪 60
Multiplier: 3.08 cookies/hr

The biggest challenge was moving from a simple script to a truly modular architecture. I had to implement clean API clients for NASA and Gemini, handle local data caching to avoid redundant requests, and set up a proper testing suite with pytest. Ensuring the “Spaced Repetition” logic for the flashcards was functional and saved user progress correctly was also a tough but rewarding hurdle.
I’m proud of the project’s robustness. It’s not just a demo; it has automated CI/CD workflows, environment variable management, and a structure that follows professional standards.

ChefThi
  • fix(demo): translate offline cache to english and adjust quiz sequence to DBBAC (105962c)
  • fix(api): update gemini model to 2.5-flash due to deprecation (1c3ba3a)
  • final: delivery version 1.0 (MVP) 🚀 (24a859c)

Hitting v1.0 (MVP, I'd say) milestone. AstroLab is officially ready for submission. This session was all about the final polish, making sure the system is stable and the reviewer experience is as smooth as possible.

I had to do a last-minute fix because Google deprecated the old model—classic move. I updated the client to gemini-2.5-flash and double-checked the Smart Demo Mode. Now there’s no excuse for a reviewer to say they couldn’t test it.

Here is the v1.0 lineup:

  • ./astrolab — Interactive main menu.
  • apod — NASA daily data and explanations.
  • quiz — Tests + Deep Dive AI feedback.
  • flashcard / review — Persistent study system.
  • stats — Progress tracking with bars.

This project turned from a boring diary into a real CLI tool for astronomy and engineering. Coding on the bus (in this final sessions only a bit) and fighting API quotas was worth it. This marks my almost ship for the Sidequest Space Mission.

nasa-large

Used Gemini CLI to help wrap up the documentation and keep the syntax clean for this final push.

Attachment
Attachment
0
ChefThi
  • feat(i18n): translate entire project to English and add ‘astrolab’ init script 🌎 (cfebf53)

Finished full internationalization of AstroLab. The project—strings, comments, and docs—is now in English. I wanted to make it accessible to a global audience and give it that professional “factory” feel. It was a lot of work to keep the technical astronomy terms accurate while swapping everything, but it’s done. 🌍

I also added a dedicated ./astrolab executable. I was tired of typing python main.py every time I wanted to test something, especially when I’m working on the go or in Termux. Now it’s just one command and the interactive menu pops up. It makes the whole experience much cleaner and closer to that Absolute Cinema vibe I’m looking for.

On the technical side, I had to do a lot of manual verification. I used the Gemini CLI to handle the bulk of the translation, but you can’t just trust it blindly—I had to make sure the astronomy vocabulary stayed sharp and the logic didn’t break during the text swap. AI is good for the “mechanical” part, but the final polish has to be human.

The README is now updated with the new instructions for the executable and the Smart Demo Mode. The codebase is clean, consistent, and ready for anyone to use, regardless of where they are.

Used Gemini CLI to accelerate the repetitive translation parts, but I was the one keeping the Senior Mentor eyes on the final result.
googlegemini

Attachment
Attachment
0
ChefThi
  • feat(demo): add Smart Demo Mode with rich offline cache for reviewers 🛡️” (cfebf53)

I finally implemented the Smart Demo Mode to make AstroLab more resilient. I’ve had projects rejected before because reviewers won't bother setting up API keys, so I built a rich offline cache in demo_cache.json. Now, even without internet or keys, you can still run quizzes and deep-dives on things like black holes and time dilation. It just works. Nice 😎 my dears (at least I think)

During part of the development, the AI ​​ended up messing with things it shouldn’t have, changing the model to 1.5-flash even though the Gemini 3.1 family already exists. Be careful about what you delegate to AIs, guys! 😤

On the project management side, I added a GEMINI.md file to define the AI persona I use as a “Senior Mentor.” It keeps the coding standards and Termux/Android constraints consistent across the project. And I explained to her not to do things I didn’t ask for.

Lastly, I did some house cleaning. I removed old, unrelated files from my learning folders and other projects to keep the repo focused on the factory.

Used the Gemini CLI to handle the repetitive syntax and speed up the boring parts of this session. googlegemini

Attachment
Attachment
0
ChefThi
  • feat(cli): add interactive menu and elegant API key warnings ✨ (51299a8)
  • feat(flashcards): add deck manager to save and review generated cards 🃏 (c41f658)

Flashcards and a better CLI flow

AstroLab is finally starting to feel like a real tool and not just a beta script. This session was mostly about making the flashcards actually stick and fixing the CLI so it doesn’t drive me crazy when I’m using it.

I built a persistent deck manager because having flashcards that vanish after the session was useless. Now they save in the data/ folder, and I added a review command so I can actually study them later. It’s about building a library of knowledge over time.

The interactive menu was a necessity. Typing full commands on a mobile keyboard while the bus is shaking is a nightmare, so now if you run the script without arguments, it just gives you a clean menu to pick from. I also hardened the API key warnings—instead of the app just crashing, it now tells you exactly what’s missing and how to fix it.

On the technical side, the biggest pain was refactoring the argument parsing to make the new menu work with the old direct commands without breaking everything. I also had to be careful with JSON paths to make sure the decks load correctly no matter where the script is called from.

The factory is getting organized. It’s usable, it’s persistent, and it’s starting to have that essence I wanted.

While studying programming languages ​​and writing some march files in .md format, I discovered that semicolons (3 in this case ***) create a line that divides the text. This makes things more organized, which I found interesting. eh

Attachment
Attachment
Attachment
0
ChefThi

Making AstroLab smarter: Stats and Deep-Dive feedback

Today I moved beyond just fetching NASA photos. I wanted AstroLab to feel like a real study system, not just a script that asks questions and disappears.

Tracking the grind:
I finally added a session history module. Now, every time I finish a quiz, it saves the data automatically. I built a stats command with progress bars so I can actually see my average scores and how many questions I’ve tackled. It’s good to see the progress recorded instead of just floating in the terminal.

Learning from mistakes:
The coolest part of this session was the “Deep-Dive” explanations. Before, if you got a question wrong, that was it. Now, I’ve hooked Gemini up to explain why you missed it. It takes the correct concept and breaks it down, sometimes even linking it back to the NASA APOD context. It turns a “wrong” into a real lesson.

The technical headaches:

  • Gemini being inconsistent: The API was acting up with the response formats again. I had to harden the prompt engineering and add some fallback logic so it doesn’t break the CLI display.
  • JSON Persistence: Handling the session saving was a bit annoying, but I built a SessionManager class to keep the JSON serialization robust. No more losing data.
  • CLI Polish: I spent way more time than I expected just making the terminal output look clean. CLI formatting is always a trap—it looks simple but takes forever to get the alignment right.

The system is feeling much more solid now. It has memory, it has feedback, and it’s actually helping me learn.

Attachment
Attachment
Attachment
1

Comments

ChefThi
ChefThi 26 days ago

Forgot the changelog:

`- feat(gamification): add session history and CLI stats table 📊 (78b8eae)

  • chore: ignora TESTES e corrige gemini client (6ea0c86)
  • feat(deep-dive): add AI-powered detailed explanation for wrong answers 🧠 (e7ae7c4)`
ChefThi

Study-Lab-Core pivot to a Space project

I’ll be real: Study Lab Core was dying. It was becoming a generic “personal diary” of my Python/Node exercises, and it had no soul, getting boring for me because I was more advanced in other projects I’m enjoying it, I’m able to do it, and they’re really great for me. And also that it could be useful not only for beginners but for other developers and people who like astronomy and things like that. As a Computer Engineering freshman facing a 10km daily bus commute, I don’t have more time I need something that actually makes me want to open the terminal when I’m tired and holding a handrail.

Today, I decided to pivot. AstroLab is born

Why?

I was looking for a way to make my learning more “Absolute Cinema”—something with a real pipeline and high-quality data. I saw the Space Mission sidequest on Flavortown and it clicked. I used Perplexity to brainstorm how to turn a CLI into a science lab, and we landed on the NASA APOD (Astronomy Picture of the Day).

Instead of just “studying,” I’m now building a factory that ingests the universe every day.

What I did in these 10+ hours:

  • Monorepo Surgery: I spent a lot of time re-organizing my folders. I separated the “learning” scratchpads from the actual “shippable” project.
  • CLI Architecture: Started mapping out how the terminal will render the NASA data. It has to be readable on a small screen (for my Firebase Studio/Mobile sessions) but look professional on a PC.
  • The “Bus Test”: Most of this architecture was planned or drafted while the bus was shaking. If the logic doesn’t hold up when I’m distracted by the noise and the crowd, it’s not hardened enough.
Attachment
Attachment
1

Comments

ChefThi
ChefThi about 23 hours ago

Don’t It fit in this post. The thing is, the limit is 2000 characters.

Thinked

AstroLab won’t just be a script. It’s going to be a tool where the universe is the teacher. I’m delegating the repetitive “mechanical” parts of the code to the IA, but the essence—the organization, the flow, and the “Absolute Cinema” feel—is all me.

The project is now focused on the space.

ChefThi

Título: Estruturação Inicial e Simulação Wokwi
Data: 2026-01-28
Commits:

  • eda9319 — feat: iniciando o repo e aproveitei e falei sobre um projeto que mexi hoje
  • 507906f — refactor(structure): Organize monorepo for learning and projects

Resumo: Inicialização do repositório Study-Lab-Core e organização da estrutura de monorepo para separar exercícios de aprendizado de projetos reais.

O que foi feito:

  • Criação do repositório core para centralizar estudos e projetos de hardware/firmware.
  • Reorganização total da estrutura de pastas:
    • Logs de projetos movidos para a raiz.
    • Criado diretório /logs para notas gerais e registros de aprendizado.
    • Consolidado projeto ‘servomotor’ em /projects.
    • Criado diretório /learning para módulos de estudo focados.
  • Atualização do diagram.json para refletir o setup atual no Wokwi.
  • Adição de scratchpad.md para notas rápidas de desenvolvimento.

Resultados: Estrutura de diretórios limpa, escalável e pronta para novos módulos. Simulação no Wokwi funcional e integrada ao fluxo de commits.

Attachment
0