Javier Cervantes

Transforming businesses with efficiency and innovation
Principal Software Engineer @ Gray Wolf

Mobile apps have become part of our daily lives, but developing one can be a complicated process, specially when you’re specialized in mobile development.

Hybrid apps have been around for a while since they provide a faster and cost-effective path to build a mobile application by reducing maintenance and development timelines by using web technologies to build the core of the application and generate shell native apps for iOS and Android. Also, with the added benefit of publishing changes faster without the need of additional App Store approval.

In the past our team used the Ionic framework, but a decade later there are new technologies that make the process faster, more robust and even easier to get started.

When a client recently approached with the need to develop a mobile application, and after researching different alternatives to build it, we created a blueprint that can be used for future projects. Below you’ll find an overview of the approach, please to reach out if you have any questions.

Tech Stack


Deployment & Infrastructure

To host the application we deploy Ruby On Rails Web App on Render using web and databse services:

With the github integration, render automatically redeploys the project with every commit to the selected branch (using the render.yaml file).

The build and deployment process for the native apps is the same as any other app. For iOS we used TestFlight for internal testing.

Additional Resources

Enter your email to subscribe to updates.

Making sure everyone on the team can contribute to a project is fundamental for success. Unfortunately, documentation is usually obsolete or even non-existent in most of the projects.

The broken window theory explains how negative feedback loops can lead to an unsutainable environment in the long run. Teams that need to reverse engineer the code to understand it will have a longer learning curve. Having an updated documentation enables everyone to go faster.

The agile manifesto values “working software over comprehensive documentation”. But a robust documentation will ensure the software can be mantained a year later too.

By leading engineering teams over the last decade I've seen teams thrive by making documentation a first class citizen. I created a Confluence template with the most relevant sections. To keep it updated, documentation can be included as a deliverable for every feature.

Below are the tempate sections, reach out if you would like to get a copy for your personal use:

  • Access
  • Engineering
    • Architecture Diagram
    • Branching Strategy
    • Coding Standards / Styleguide
    • Data Mapping
    • Deployment Process
    • Most Frequent Error Logs
    • Glossary
    • Go-Live Readiness Checklist
    • Infrastructure Diagram
    • Local Environment Setup
    • Resources library
    • Tech Stack
    • Technical Debt / Improvements
    • Test Plan
  • Decisions
    • [Decision template]
  • Features
    • [Feature template]
  • Guides
    • [Guide template]
  • Integrations
    • [Integration template]
  • Project Management
    • Discovery / Project Description
    • Onboarding checklist
    • Team
  • Meetings
    • [Date] - [Meeting Template]
  • Releases
    • [Version] - [Release Notes]
  • Retrospectives
    • [Date] - [Retrospective template]

Enter your email to subscribe to updates.

In a recent Adobe Experience Manager project, there were multiple security restrictions with access, so we enabled a repository for each team to work on the project and enable every organization to manage the permissions.

Additionaly, in AEM as a Cloud Service, there is also a Cloud Manager repository that needs to be kept in sync to trigger the deployment to the managed instances.

We used a continuous integration pipeline to ensure the code repositories were in sync. Below is a diagram with the workflow that was implemented:

To make it work we enabled bitbucket pipelines, configured the repository variables and updated the content of the bitbucket-pipelines.yml file:

image: atlassian/default-image:3

    - step: &sync-remote-adobe
        name: Push to Adobe Experience cloud
          - if [[ $ADOBE_CM_GIT_SLUG ]]; then
          - git remote add adobe https://$ADOBE_CM_USERNAME:$ADOBE_CM_PASSWORD@git.cloudmanager.adobe.com/$ADOBE_CM_GIT_SLUG
          - git pull adobe $BITBUCKET_BRANCH --tags
          - git push adobe $BITBUCKET_BRANCH --tags
          - else
          - echo "Step skipped, ADOBE_CM_GIT_SLUG variable not configured"
          - fi

    - step: &push-bitbucket-mirror
        name: Push to Bitbucket Mirror
          - if [[ $MIRROR_GIT_SLUG ]]; then
          - git remote add mirror https://x-token-auth:$MIRROR_TOKEN@bitbucket.org/$MIRROR_GIT_SLUG
          - git push mirror $BITBUCKET_BRANCH --tags
          - else
          - echo "Step skipped, MIRROR_GIT_SLUG variable not configured"
          - fi

        - step: *push-bitbucket-mirror
        - step: *sync-remote-adobe
        - step: *push-bitbucket-mirror
        - step: *sync-remote-adobe

Bonus: Sync repositories using github actions

If you’re looking on how to keep different repositories in sync but and the repositories are hosted on github, you can use the mirror-repository action.

Below is a template to configure it with only 2 steps:

1. Commit a file with the configuration:


      - develop

    runs-on: ubuntu-20.04

      - uses: actions/checkout@v3
          fetch-depth: 0
      - uses: yesolutions/mirror-action@master
          REMOTE: ${{ secrets.GIT_REPO }}
          GIT_USERNAME: ${{ secrets.GIT_USERNAME }}
          GIT_PASSWORD: ${{ secrets.GIT_PASSWORD }}

2. Create the secrets in the settings screen:

Enter your email to subscribe to updates.

In the last few years, there's been a shift on circumstances regarding how we work with technology. It’s necessary to adapt to the new expectations to perform at your highest potential.

What am I talking about?

  • Asynchronous collaboration
  • AI tools that can boost productivity
  • Flexible schedules
  • Less managers and meetings (or none at all)
  • More competition and higher standards

Changes have been happening over the last years, but not everyone has adapted to the new reality. It requires a mental and attitude change toward how we understand work and how we organize.

If you want to suceed in today’s landspace take into consideration the following values.

  • Trust: You need to foster it and build it by being dependable in every sense.
  • Managers of One: Determining what needs to be done, and doing it, without waiting for someone to tell you to..
  • Visibility: A steady footprint will allow you to showcase what you're delivering..
  • Goal Oriented: Self-organization to delivery results consistently.

Your future will created by the actions you make every day and your ability to collaborate with others. Are you ready?

Enter your email to subscribe to updates.

For a technology professional, it's crucial to have the necessary skills to succeed. Ensuring a strong foundation becomes even more important in today's landscape.

Beyond choosing a tech stack, there are some skills that will continue to be a good investment.


Learn and understand the principles of version control to be able to collaborate. Explore how git works, learn about branching and seek a understading of the git commands.


Basic knowledge to build a static webpage will serve as a base to use more complex technologies.

A deep knowledge will help you decide the best approach when solving a problem. Newest versions provide robust features like the nesting, grid layout and flexbox.


Ensure you master fundamental concepts, syntaxis, objects, prototypes and advanced features like promises. Learning about design patterns and how the language runs in the browser will put you a step ahead.

Shell scripting

Learning the usage of command line can improve your development experience. Shell scripting will increase your speed and efficiency.

Regular expressions

Regular expressions (or regex) are a powerful way to search for text that matches a given pattern. At their best they are simple, elegant, and useful. Learn regex beyond the basics and build you'll have a powerfull tool for complex problems.


Refactoring is improving the quality of code without changing its behavior. Refactoring is key to increase development speed and making the code more maintainable.

Software Development Lifecyle

The set of steps used to collaborate and create software applications. Understading the fundamental concepts will boost your collaboration with other team members.

New platforms and tools will emerge, but ensuring a solid foundation is crucial as it was 10 years ago.

At Gray Wolf we developed a training program for this skills, reach out if you’re interested.

Enter your email to subscribe to updates.

Over the last few months our AWS cost had been going up, so we created a plan to optimize our spening as much as possible.

After implementing the optimization plan, we were able to reduce our spending by 80%.

Here is a summary of the steps we took to get there:

  1. Created a directory of all the resources and how they were being used.

  2. Added tags to those resources to identify environment (dev, qa, prod) and the project name.

  3. We used the Billing & Cost Management Console to identify areas of opportunity.

  4. Created a projecy plan with specific tasks and owners and kept track of the progress.

  5. Repeated steps 3-4 until we reached an acceptable threshold.

Some examples of the actions that we took:

  • Simplifying architecture to remove unnecessary elements,
  • Down size EC2 instances with low utilization.
  • Consolidate compute resources to increase instance usage.
  • Created and scheduled lambda functions to auto-stop EC2 instances during off-hours.
  • Setup alerts & budgets to be more efficient moving forward.

Enter your email to subscribe to updates.

1. Review and document your current release process

Map all the activities that your team makes to deploy changes to your environments. There are no right or wrong answers, your first step is to understand where you are.

2. Generate a release checklist

Create a list of all the steps that need to take place for a release to happen. By capturing all the activities you can define an owner for each of them and make sure you keep them consistent.

3. Define a release cadence (and stick with it)

Having a regular schedule for releases will make you resolve any roadbloacks. After every release make sure you adjust your plan based on what you learn.

4. Build a script to release changes

Compile a list of commands to generate an artifact and push it to a shared enviroment. The main goal is to remove all manual steps from the deployment process.

5. Configure a deployment pipeline

Select a CI provider and translate your script to run in that tool and deploy with it. Jenkins, Github Actions and Bitbucket Pipelines are the more common options.

Enter your email to subscribe to updates.

If you are using EC2 instances, the first thing you can try is AWS Cost Explorer rightzising recommendations to help you identify opportunities to downsize or terminate instances that are being underutilized to reduce costs.

Below is a recommendation example I got to modify an instance:

To enable rightsizing recommendations

  1. Open the AWS Cost Management at https://console.aws.amazon.com/cost-management/home

  2. In the navigation pane, choose Preferences.

  3. In the Recommendations section, choose Receive Amazon EC2 resource recommendations.

  4. Choose Save preferences.

To access rightsizing recommendations

  1. Sign in to the AWS Management Console and open the AWS Cost Management console at https://console.aws.amazon.com/cost-management/home

  2. In the navigation pane, choose Rightsizing recommendations.

Enter your email to subscribe to updates.

I was inspired in Steve Klabnik A Hypermedia API Reading List, so here are some resources if you want to learn more about this topic.






API examples/docs

Media Types


Mailing lists


Enter your email to subscribe to updates.

Enter your email to subscribe to updates.