Published: Jun 23, 2026 by Isaac Johnson
IBM now has IBM Bob which is a their own AI Coding set of tools including an IDE and CLI. Bob uses “Bob Coins” which you can see detailed in the pricing page. We start with 40 that we have 30 days to use.
As I write, I’ll price at the “Pro” plan level, which I think is the most common people might try as its US$20/mo for 40 Bobcoins. That makes them US$0.50 each. Its worth pointing out that “Pro+” at US$60/mo gives 160 (so 0.375 per coin) and oddly “Ultra” is a worse deal at 500 Bobcoins for $200 (or 0.40 per coin). Now, if you have billing enabled, overages cost US$0.50/coin.
I’ll signup and see what we can do with Bob.
Signup
I have had a pretty disastrous record thus far trying to sign up for IBM suites.
With a bit of apprehension, I went to https://bob.ibm.com/trial to start a free trial.
I tried my fb email and it said “you have an account”
Surprisingly, unlike IBM Cloud, this did not block me.
I then saw an “Access your trial now” link (and a welcome email come through)
There is a “Bob IDE” and a CLI.
IDE
I downloaded the Bob Windows IDE
Even the EULA feels IBM-ish with “Program Name” and “Program Number” listed
After reading through it, i saw it would use 1.08Gb of disk space (pretty large IDE IMHO).
We can import settings from VS Code, Windsurf or Cursor
As suspected, it’s a variant of code.
I was about to complain about how long it was taking, but then I realized it was firing up all my VS Code plugins
I went ahead and logged into Bob
A lot of tools put the usage in the lower right, but Bob uses the upper area with a clearly visible usage widget
I looked through the settings for a model selector but found none. So this must be using IBM Granite at a larger level than the open-weights version
Let’s set it to create a Python app
I set it to auto-approve but it still prompted me to review and save every file so it was taking a while
At one point it just went out to lunch for over 20 minutes - no error or status… I went and watched the rest of a FIFA World Cup game and came back it had moved to the next step
since we know Bob coins today are $20/40 coins, the final tally (before I test it) is 4.19 coins or about US$2.10
My first error came installing requirements
Collecting zipp>=3.20
Downloading zipp-3.23.1-py3-none-any.whl (10 kB)
Collecting editorconfig>=0.12.2
Downloading editorconfig-0.17.1-py3-none-any.whl (16 kB)
Building wheels for collected packages: greenlet
Building wheel for greenlet (PEP 517) ... error
ERROR: Command errored out with exit status 1:
command: 'c:\users\isaac\desktop\deacon-care-list\venv\scripts\python.exe' 'c:\users\isaac\desktop\deacon-care-list\venv\lib\site-packages\pip\_vendor\pep517\in_process\_in_process.py' build_wheel 'C:\Users\isaac\AppData\Local\Temp\tmpsh82wlg3'
cwd: C:\Users\isaac\AppData\Local\Temp\pip-install-ao8i_xtx\greenlet_218ed73e89a745a39457f10769c784bd
Complete output (112 lines):
running bdist_wheel
running build
running build_py
creating build\lib.win-amd64-cpython-39\greenlet
copying src\greenlet\__init__.py -> build\lib.win-amd64-cpython-39\greenlet
creating build\lib.win-amd64-cpython-39\greenlet\platform
copying src\greenlet\platform\__init__.py -> build\lib.win-amd64-cpython-39\greenlet\platform
I let Bob try and fix it
It seems this time the auto-approve worked (so perhaps that setting only takes affect and the start of a task).
That worked (and up to 5.65 Bob coins)
I got another crash and another shot to let Bob fix it
We are up to 6.82 coins and I had yet another error
8.66 and another error.. i started to fix the requirements related ones myself just from console output
I got a secret error I sent at it
(venv) PS C:\Users\isaac\Desktop\deacon-care-list> python -m app.main
Traceback (most recent call last):
File "C:\Program Files\Python39\lib\runpy.py", line 197, in _run_module_as_main
return _run_code(code, main_globals, None,
File "C:\Program Files\Python39\lib\runpy.py", line 87, in _run_code
exec(code, run_globals)
File "C:\Users\isaac\Desktop\deacon-care-list\app\main.py", line 248, in <module>
CookieBackendConfig(
File "<string>", line 14, in __init__
File "C:\Users\isaac\Desktop\deacon-care-list\venv\lib\site-packages\litestar\middleware\session\client_side.py", line 268, in __post_init__
raise ImproperlyConfiguredException("secret length must be 16 (128 bit), 24 (192 bit) or 32 (256 bit)")
litestar.exceptions.http_exceptions.ImproperlyConfiguredException: 500: secret length must be 16 (128 bit), 24 (192 bit) or 32 (256 bit)
(venv) PS C:\Users\isaac\Desktop\deacon-care-list>
But the fix didn’t seem to work (setting a larger secret to 32 characters).
I fixed that myself ultimately and then had to fix one more error before the app would finally run. I ended up spending $6.00 on this (and we haven’t even setup containers or database migrations or kubernetes manifests yet!)
I have an app running
The app is very vertical which means it probably works well on phones
I went to families and saw a failed to load error
But sadly there are lots of errors. The dashboard throws console errors
and
And it doesn’t save “Add Families” so no way to add new ones..
CLI
Let’s move on to the CLI to see if we can resolve some of these issues
builder@DESKTOP-QADGF36:~$ nvm use lts/jod
Now using node v22.22.0 (npm v10.9.4)
builder@DESKTOP-QADGF36:~$ curl -fsSL https://bob.ibm.com/download/bobshell.sh | bash
Checking Node.js Installation
✓ Node.js version 22.22.0 detected (minimum 22.15 required)
Package Manager Selection
→ Tip: You can skip this selection by using: --package-manager or --pm (e.g., --pm npm)
→ Only npm is available. Using it automatically.
Downloading bobshell
→ Fetching latest version...
✓ Latest version: 1.0.4
Installing bobshell
→ Installing bobshell 1.0.4 with npm...
Installation Complete! ✓
✓ bobshell 1.0.4 has been successfully installed
→ You can now run: bob
Usage data is collected by default.
→ To opt out, type /settings, navigate to Enable Usage Metrics and set the flag to false
I then moved the app into WSL
builder@DESKTOP-QADGF36:~/Workspaces$ mv /mnt/c/Users/isaac/Desktop/deacon-care-list ./
builder@DESKTOP-QADGF36:~/Workspaces$ cd deacon-care-list/
builder@DESKTOP-QADGF36:~/Workspaces/deacon-care-list$ ls
QUICKSTART.md README.md WINDOWS_INSTALL.md app create_admin.py deacon_care.db requirements.txt static venv
I’ll git init and make a gitignore file
builder@DESKTOP-QADGF36:~/Workspaces/deacon-care-list$ gi linux,python | tee .gitignore
# Created by https://www.toptal.com/developers/gitignore/api/linux,python
# Edit at https://www.toptal.com/developers/gitignore?templates=linux,python
### Linux ###
*~
# temporary files which can be created if a process still has a handle open of a deleted file
.fuse_hidden*
# KDE directory preferences
.directory
# Linux trash folder which might appear on any partition or disk
.Trash-*
# .nfs files are created when an open file is removed but is still being accessed
.nfs*
### Python ###
# Byte-compiled / optimized / DLL files
__pycache__/
*.py[cod]
*$py.class
# C extensions
*.so
# Distribution / packaging
.Python
build/
develop-eggs/
dist/
downloads/
eggs/
.eggs/
lib/
lib64/
parts/
sdist/
var/
wheels/
share/python-wheels/
*.egg-info/
.installed.cfg
*.egg
MANIFEST
# PyInstaller
# Usually these files are written by a python script from a template
# before PyInstaller builds the exe, so as to inject date/other infos into it.
*.manifest
*.spec
# Installer logs
pip-log.txt
pip-delete-this-directory.txt
# Unit test / coverage reports
htmlcov/
.tox/
.nox/
.coverage
.coverage.*
.cache
nosetests.xml
coverage.xml
*.cover
*.py,cover
.hypothesis/
.pytest_cache/
cover/
# Translations
*.mo
*.pot
# Django stuff:
*.log
local_settings.py
db.sqlite3
db.sqlite3-journal
# Flask stuff:
instance/
.webassets-cache
# Scrapy stuff:
.scrapy
# Sphinx documentation
docs/_build/
# PyBuilder
.pybuilder/
target/
# Jupyter Notebook
.ipynb_checkpoints
# IPython
profile_default/
ipython_config.py
# pyenv
# For a library or package, you might want to ignore these files since the code is
# intended to run in multiple environments; otherwise, check them in:
# .python-version
# pipenv
# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
# However, in case of collaboration, if having platform-specific dependencies or dependencies
# having no cross-platform support, pipenv may install dependencies that don't work, or not
# install all needed dependencies.
#Pipfile.lock
# poetry
# Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control.
# This is especially recommended for binary packages to ensure reproducibility, and is more
# commonly ignored for libraries.
# https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control
#poetry.lock
# pdm
# Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control.
#pdm.lock
# pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it
# in version control.
# https://pdm.fming.dev/#use-with-ide
.pdm.toml
# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm
__pypackages__/
# Celery stuff
celerybeat-schedule
celerybeat.pid
# SageMath parsed files
*.sage.py
# Environments
.env
.venv
env/
venv/
ENV/
env.bak/
venv.bak/
# Spyder project settings
.spyderproject
.spyproject
# Rope project settings
.ropeproject
# mkdocs documentation
/site
# mypy
.mypy_cache/
.dmypy.json
dmypy.json
# Pyre type checker
.pyre/
# pytype static type analyzer
.pytype/
# Cython debug symbols
cython_debug/
# PyCharm
# JetBrains specific template is maintained in a separate JetBrains.gitignore that can
# be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore
# and can be added to the global gitignore or merged into this file. For a more nuclear
# option (not recommended) you can uncomment the following to ignore the entire idea folder.
#.idea/
### Python Patch ###
# Poetry local configuration file - https://python-poetry.org/docs/configuration/#local-configuration
poetry.toml
# ruff
.ruff_cache/
# LSP config files
pyrightconfig.json
# End of https://www.toptal.com/developers/gitignore/api/linux,python
Then add what i have - this creates a good checkpoint to which we can roll back if needed
builder@DESKTOP-QADGF36:~/Workspaces/deacon-care-list$ git add .gitignore
builder@DESKTOP-QADGF36:~/Workspaces/deacon-care-list$ git add -A
builder@DESKTOP-QADGF36:~/Workspaces/deacon-care-list$ git commit -m "phase1"
[main (root-commit) fabe738] phase1
35 files changed, 4271 insertions(+)
create mode 100755 .env.example
create mode 100644 .gitignore
create mode 100755 QUICKSTART.md
create mode 100755 README.md
create mode 100755 WINDOWS_INSTALL.md
create mode 100755 app/__init__.py
create mode 100755 app/config.py
create mode 100755 app/controllers/__init__.py
create mode 100755 app/controllers/auth.py
create mode 100755 app/controllers/family.py
create mode 100755 app/database.py
create mode 100755 app/main.py
create mode 100755 app/models/__init__.py
create mode 100755 app/models/contact.py
create mode 100755 app/models/family.py
create mode 100755 app/models/note.py
create mode 100755 app/models/parishioner.py
create mode 100755 app/models/user.py
create mode 100755 app/schemas/__init__.py
create mode 100755 app/schemas/dto.py
create mode 100755 app/services/__init__.py
create mode 100755 app/services/auth_service.py
create mode 100755 app/services/family_service.py
create mode 100755 app/templates/404.html
create mode 100755 app/templates/base.html
create mode 100755 app/templates/dashboard.html
create mode 100755 app/templates/family_detail.html
create mode 100755 app/templates/family_form.html
create mode 100755 app/templates/family_list.html
create mode 100755 app/templates/login.html
create mode 100755 create_admin.py
create mode 100755 deacon_care.db
create mode 100755 requirements.txt
create mode 100755 static/css/style.css
create mode 100755 static/js/app.js
I can now invoke bob to run Bob CLI
I had to launch twice to get it to give me a URL as it was hung up trying to fire up a Firefox in WSL
Next, I started it working on the save family issue
I didn’t capture the whole thing as I mostly wanted you to see how performant it was and how it worked.
That said, it did fix the issue. I appreciated how it kept testing (I was testing on the side as well)
This took 3.9 bob coins so fixing that error was almost $2
Let’s add a feature next:
It seemed to add the feature in pretty rapid order
It worked, but the photo is a bit large.
I kept working it till the dashboard errors were fixed and the image size looked proper. At this point I’ve used 25.17 coins of my initial 40 grant (ie. spent about $12.55 on this app so far)
I added more features and have to say I adore the traditional IBM blue used. Harkens to a simpler time on PS/1 terminals.
As Bob built admin scripts, I appreciated the top comment blocks and user guide markdown files
I noticed a .bob folder I likely need to add to my gitignore file. It seems to keep a running history of work in sessions
(.venv) builder@DESKTOP-QADGF36:~/Workspaces/deacon-care-list$ cat .bob/notes/pending-notes.txt
{"id":"7ab072b2-7854-46a5-b630-e5078b7cb8c4","ts":"2026-06-23T12:39:57.036Z","path":"/home/builder/Workspaces/deacon-care-list/app/models/user.py","version":"1.0.0","taskID":"a333fec6-86d2-4c27-b1a7-d84c6837f796"}
{"id":"63142331-a097-4a11-a362-23169d350506","ts":"2026-06-23T12:40:05.785Z","path":"/home/builder/Workspaces/deacon-care-list/migrations/add_is_active_to_users.py","version":"1.0.0","taskID":"a333fec6-86d2-4c27-b1a7-d84c6837f796"}
{"id":"46315469-dd54-4597-8548-a851c86aca07","ts":"2026-06-23T12:40:29.306Z","path":"/home/builder/Workspaces/deacon-care-list/app/services/auth_service.py","version":"1.0.0","taskID":"a333fec6-86d2-4c27-b1a7-d84c6837f796"}
{"id":"097be3a7-4942-4bd5-b7e5-2ffa38ce072b","ts":"2026-06-23T12:40:36.400Z","path":"/home/builder/Workspaces/deacon-care-list/app/schemas/auth_dto.py","version":"1.0.0","taskID":"a333fec6-86d2-4c27-b1a7-d84c6837f796"}
{"id":"a2962d29-242b-489a-8323-ca4d87eb582c","ts":"2026-06-23T12:40:43.672Z","path":"/home/builder/Workspaces/deacon-care-list/app/controllers/auth.py","version":"1.0.0","taskID":"a333fec6-86d2-4c27-b1a7-d84c6837f796"}
{"id":"8dc1def9-59c1-42b4-968d-328be7dc35c0","ts":"2026-06-23T12:40:54.890Z","path":"/home/builder/Workspaces/deacon-care-list/app/controllers/auth.py","version":"1.0.0","taskID":"a333fec6-86d2-4c27-b1a7-d84c6837f796"}
{"id":"8fcbfea0-c593-4500-9edc-168dbe3fa442","ts":"2026-06-23T12:41:14.914Z","path":"/home/builder/Workspaces/deacon-care-list/admin_users.py","version":"1.0.0","taskID":"a333fec6-86d2-4c27-b1a7-d84c6837f796"}
{"id":"9377e801-bdb6-4369-98f3-8c248dd48f7c","ts":"2026-06-23T12:42:19.361Z","path":"/home/builder/Workspaces/deacon-care-list/admin_users.py","version":"1.0.0","taskID":"a333fec6-86d2-4c27-b1a7-d84c6837f796"}
{"id":"dadae84a-50f5-4d71-a651-8318751d3f3a","ts":"2026-06-23T12:42:24.790Z","path":"/home/builder/Workspaces/deacon-care-list/admin_users.py","version":"1.0.0","taskID":"a333fec6-86d2-4c27-b1a7-d84c6837f796"}
{"id":"54736401-1317-4020-b433-37683f4ce3de","ts":"2026-06-23T12:42:32.192Z","path":"/home/builder/Workspaces/deacon-care-list/admin_users.py","version":"1.0.0","taskID":"a333fec6-86d2-4c27-b1a7-d84c6837f796"}
{"id":"d688c6ef-d23b-4ee6-8d33-076d2a196e7e","ts":"2026-06-23T12:42:51.430Z","path":"/home/builder/Workspaces/deacon-care-list/app/models/__init__.py","version":"1.0.0","taskID":"a333fec6-86d2-4c27-b1a7-d84c6837f796"}
{"id":"39638360-0d7d-4965-97e0-4a6032bdd0be","ts":"2026-06-23T12:43:10.539Z","path":"/home/builder/Workspaces/deacon-care-list/app/templates/change_password.html","version":"1.0.0","taskID":"a333fec6-86d2-4c27-b1a7-d84c6837f796"}
{"id":"4643873c-301a-480a-a249-677b6495044c","ts":"2026-06-23T12:43:28.063Z","path":"/home/builder/Workspaces/deacon-care-list/app/main.py","version":"1.0.0","taskID":"a333fec6-86d2-4c27-b1a7-d84c6837f796"}
{"id":"d513697c-b9e1-46b1-8a2c-4612a3a7baa0","ts":"2026-06-23T12:43:57.457Z","path":"/home/builder/Workspaces/deacon-care-list/app/templates/base.html","version":"1.0.0","taskID":"a333fec6-86d2-4c27-b1a7-d84c6837f796"}
{"id":"c2a771df-b9e6-4ec0-9a6f-fb281fbad329","ts":"2026-06-23T12:45:09.424Z","path":"/home/builder/Workspaces/deacon-care-list/ADMIN_USERS_GUIDE.md","version":"1.0.0","taskID":"a333fec6-86d2-4c27-b1a7-d84c6837f796"}
In testing, it changed the admin password which surprised me (as it has a testuser).. I had to go widescreen to figure out what it was changed to:
I wrapped my session by parameterizing the Upload dir, DB dir and app ports.. I can see that I’m not all used up on Bob Coins
We can see it gives a basic summary when we complete a CLI session:
Summary
I have an app - it needs to be containerized, built with CICD, pushed to Forgejo and likely hosted in K8s still. I’ll have to use an alternate tool for that as we completely used all the free trail credits (40 Bobcoins)
Here is a tour of the app we built:
When I compare it with other tools, with the exception of that one blip that seemed to take forever last night, it did a great job. The CLI seemed to do a better job testing things than the IDE.
The comments are solid, the layout - which I gave it no guidance on - was clean and well done. Overall I liked the performance for a basic Python app.
However, the cost is something to consider. I didn’t even complete this app and we spent the full 40 Bobcoins. If I was spending $20 a month and could just start one app a month, I would question the value.
Other than the cost, I was pleased and likely will revisit to see if 40 was all I got or it refreshes at some point. I will assume it was one and done.






































