React Native + Expo Go Week 9

Week 12 of documenting my app development learning journey (Aug 11 - Aug 18)

A Look Outside My Network:

More Google stuff! Google upgrades AI coding agent Jules: Jules now reviews and critiques code during development, not just after, speeding up feedback and improving the final product. This is expected to influence how mobile apps are developed and maintained with rapid iteration.

This Week’s Goal:

Finish PedroTech’s tutorial on React Native, and learn how to implement some of my own things!

What I Did Last Week:

I got through a significant portion of the tutorial, where I delved into the different features and “organizational structures” of AppWrite, the (free!) database provider that I was using (backend), and I figured out a bug that made me frustrated with my code for a while (spoiler: it had to do with my project’s file structure).

Robotics meeting for my school (FIRST, specifically FRC) are starting meeting again, and because I’m a junior who has a lot of experience within our team, I’ll be posting even less, but I’ll do my best to keep up with this, if time allows.

August 13th, 2025

Almost done creating a habit according to the tutorial’s directions, but TypeScript doesn’t seem to be recognizing the new database IDs I’m using for it to connect with AppWrite:

const handleSubmit = async () => {
    if (!user) return;

    try {
      await databases.createDocument(
        DATABASE_ID, 
        HABITS_COLLECTION_ID, 
        ID.unique(),

TypeScript being silly .-.

When I double checked my .env.local and my appwrite.ts files, the names were the same, so I didn’t know what the error was. Turns out, it’s actually a safety-feature-like thing because when a I used process.env. to assign the value to DATABASE_ID, this is how process.env actually works:

interface ProcessEnv {
  [key: string]: string | undefined;
}

Meaning that DATABASE_ID could be assigned the value undefined. So, I had to use an ! (exclamation mark) at the end of the ID name, i.e. process.env.EXPO_PUBLIC_DATABASE_ID!;, to tell TypeScript that this object does indeed exist.

August 16th, 2025

Today, I updated the permissions for registered users of the app to edit habits. In a habit planning app, users should be able to create, edit, update, and delete their tasks and habits as they do please, right? So, in AppWrite, to make the users able to do those four functions to their habits, I went to a collection’s page (in this case habits) and went to the “settings” tab of that collection. There, I went to the “permissions” section and added a “new role”, in which I selected the “all guests” (because I was editing the access that all guests have to habit instances), and checked off all four functions so that users can do so to habits.

Here’s a review of all the organization of the database provider (AppWrite) I’m using for this project:

Project (i.e., AP Stat App) → Database (e.g., habits_db) → Collection (e.g., habits) → Documents (e.g., Take a shower)

Collections function like classes in OOP programming.

Later, however, I ran into an error with the created_at attribute being undefined,

The error? It was as simple as missing the parentheses at the end of this line:

// Incorrect
created_at: new Date().toISOString
// Correct
created_at: new Date().toISOString()

Well, I guess that really emphasizes the need to pay attention to errors in plain sight! (this was a really really simple error)

AppWrite saved the task that I inputted! (idk why there’s two but I used Android Studio to emulate a Pixel 9a for this demo, so it was probably just buggy on their end)

Resources:

Special Thanks:

To ChatGPT-5, who is still debugging my code (I mean who isn’t using it to debug their code?)