This is the Notify front-end for government users and admins. To see it in action, check out the demo site (contact team for credentials).
Through the interface, users can:
The Notify.gov API provides the UI's backend and is required for most things to function. Set that up first!
Our other repositories are:
You will need the following items:
.mil
,
.gov
, or .fed.us
email address) and getting access to the
notify-local-dev
and notify-staging
spaces.In addition, you should set up the Notify.gov API first!
Follow the instructions here to set up the Notify.gov API.
The Notify.gov API is required in order for the Notify.gov Admin UI to run, and it will also take care of many of the steps that are listed here. The sections that are a repeat from the API setup are flagged with an [API Step] label in front of them.
This project is set up to work with
nvm (Node Version Manager)
for managing and using Node.js (version 22.3.0) and the npm
package manager.
These instructions will walk you through how to set your machine up with all of the required tools for this project.
If you are using VS Code, there are also instructions for running inside Docker.
On MacOS, using Homebrew for package management is highly recommended. This helps avoid some known installation issues. Start by following the installation instructions on the Homebrew homepage.
Note: You will also need Xcode or the Xcode Command Line Tools installed. The quickest way to do this is is by installing the command line tools in the shell:
xcode-select –-install
If this is your first time installing Homebrew on your machine, you may need to
add its binaries to your system's $PATH
environment variable so that you can
use the brew
command. Try running brew help
to see if Homebrew is
recognized and runs properly. If that fails, then you'll need to add a
configuration line to wherever your $PATH
environment variable is set.
Your system $PATH
environment variable is likely set in one of these
locations:
For BASH shells:
~/.bashrc
~/.bash_profile
~/.profile
For ZSH shells:
~/.zshrc
~/.zprofile
There may be different files that you need to modify for other shell environments.
Which file you need to modify depends on whether or not you are running an interactive shell or a login shell (see this Stack Overflow post for an explanation of the differences). If you're still not sure, please ask the team for help!
Once you determine which file you'll need to modify, add these lines before any
lines that add or modify the $PATH
environment variable; near or at the top
of the file is appropriate:
# Homebrew setup
eval "$(/opt/homebrew/bin/brew shellenv)"
This will make sure Homebrew gets setup correctly. Once you make these changes,
either start a new shell session or source the file
(source ~/.FILE-YOU-MODIFIED
) you modified to have your system recognize the
changes.
Verify that Homebrew is now working by trying to run brew help
again.
There are several packages you will need to install for your system in order to get the app running (and these are good to have in general for any software development).
Start off with these packages since they're quick and don't require additional configuration after installation to get working out of the box:
You can install them by running the following:
brew install jq git tfenv cloudfoundry/tap/cf-cli@8 vim wget
As a part of the installation above, you just installed tfenv
to manage
Terraform installations. This is great, but you still need to install Terraform
itself, which can be done with this command:
tfenv install latest:^1.4.0
NOTE: This project currently uses the latest `1.4.x release of Terraform.
Now we're going to install a tool to help us manage Python versions and virtual environments on our system. First, we'll install pyenv and one of its plugins, pyenv-virtualenv, with Homebrew:
brew install pyenv pyenv-virtualenv
When these finish installing, you'll need to make another adjustment in the
file that you adjusted for your $PATH
environment variable and Homebrew's
setup. Open the file, and add these lines to it:
# pyenv setup
export PYENV_ROOT="$HOME/.pyenv"
command -v pyenv >/dev/null || export PATH="$PYENV_ROOT/bin:$PATH"
eval "$(pyenv init -)"
eval "$(pyenv virtualenv-init -)"
Once again, start a new shell session or source the file in your current shell session to make the changes take effect.
Now we're ready to install the Python version we need with pyenv
, like so:
pyenv install 3.12
This will install the latest version of Python 3.12.
NOTE: This project currently runs on Python 3.12.x.
Lastly, we need to install the tool we use to manage Python dependencies within the project, which is poetry.
Visit the official installer instructions page and follow the steps to install Poetry directly with the script.
This will ensure poetry
doesn't conflict with any project virtual environments
and can update itself properly.
The project will manage most of the Node.js pieces for you, but you will need to install nvm (Node Version Manager) in order for things to work.
Follow the steps in the installation instructions to get nvm
installed with
the install script they provide, and double check that the file that you
adjusted for your $PATH
environment variable and Homebrew's setup is properly
updated with the nvm
setup as well.
Open the file and check for the nvm
setup lines; if they're not there, then
add the lines found in the
nvm installation instructions
to to the file after the pyenv
section you created, e.g.:
# nvm setup
export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" # This loads nvm
[ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion" # This loads nvm bash_completion
Once all of pre-requisites for the project are installed and you have a cloud.gov account, you can now set up the admin project and get things running locally!
First, clone the repository in the directory of your choosing on your machine:
git clone git@github.com:GSA/notifications-admin.git
Now go into the project directory (notifications-admin
by default), create a
virtual environment, and set the local Python version to point to the virtual
environment (assumes version Python 3.12.2
is what is installed on your
machine):
cd notifications-admin
pyenv virtualenv 3.12.2 notify-admin
pyenv local notify-admin
If you're not sure which version of Python was installed with pyenv
, you can check by running pyenv versions
and it'll list everything available currently.
Now log into cloud.gov in the command line by using this command:
cf login -a api.fr.cloud.gov --sso
REMINDER: Ensure you have access to the notify-local-dev
and notify-staging
spaces in cloud.gov
Now run the development Terraform setup by navigating to the development folder and running the script in it:
cd terraform/development
./run.sh
In addition to some infrastructure setup, this will also create a local .env
file for you in the project's root directory, which will include a handful of
project-specific environment variables.
If you're upgrading an existing project to a newer version of Python, you can follow these steps to get yourself up-to-date.
First, use pyenv
to install the newer version of Python you'd like to use;
we'll use 3.12
in our example here since we recently upgraded to this version:
pyenv install 3.12
Next, delete the virtual environment you previously had set up. If you followed
the instructions above with the first-time set up, you can do this with pyenv
:
pyenv virtualenv-delete notify-admin
Now, make sure you are in your project directory and recreate the same virtual environment with the newer version of Python you just installed:
cd notifications-admin
pyenv virtualenv 3.12.2 notify-admin
pyenv local notify-admin
At this point, proceed with the rest of the instructions here in the README and you'll be set with an upgraded version of Python.
If you're not sure about the details of your current virtual environment, you can run poetry env info
to get more information. If you've been using pyenv
for everything, you can also see all available virtual environments with pyenv virtualenvs
.
To configure the application for Login.gov, you will need to update the following environment variables in the .env file:
COMMIT_HASH=”--------”
Reach out to someone on the team to get the most recent Login.gov key.
LOGIN_PEM="INSERT_LOGIN_GOV_KEY_HERE"
With the newly created .env
file in place, you'll need to make one more
adjustment in it for things to run properly for the E2E tests.
Open the .env
file and look for the NODE_EXTRA_CA_CERTS
environment variable
toward the top. You will need to modify its value to be the path to Homebrew's
CA certificate file.
Run brew --prefix
to see Homebrew's root directory, and use that value to
update the NODE_EXTRA_CA_CERTS
environment variable with the path. For
example, if brew --prefix
gave /opt/homebrew
as output, then the line would
look like this:
NODE_EXTRA_CA_CERTS=/opt/homebrew/etc/ca-certificates/cert.pem
Save this change to the .env
file and you'll be squared away.
The first time you run the project you'll need to run the project setup from the root project directory:
make bootstrap
This command is handled by the Makefile
file in the root project directory, as
are a few others.
NOTE: You'll want to occasionally run make bootstrap
to keep your project up-to-date, especially when there are dependency updates.
Now you can run the web server and background workers for asynchronous jobs:
make run-flask
This will run the local development web server and make the admin site available at http://localhost:6012; remember to make sure that the Notify.gov API is running as well!
After you have completed all setup steps, you will be unable to log in, because there will not be a user in the database to link to the login.gov account you are using. So you will need to create that user in your database using the 'create-test-user' command.
Open a terminal pointing to the api project and then run this command.
poetry run flask command create-test-user --admin=True
Supply your name, email address, mobile number, and password when prompted. Make sure the email address is the same one you are using in login.gov and make sure your phone number is in the format 5555555555.
If for any reason in the course of development it is necessary for your to delete your db
via the dropdb
command, you will need to repeat these steps when you recreate your db.
We're using pre-commit
to manage hooks in order to
automate common tasks or easily-missed cleanup. It's installed as part of
make bootstrap
and is limited to this project's virtualenv.
To run the hooks in advance of a git
operation, use
poetry run pre-commit run
. For running across the whole codebase (useful after
adding a new hook), use poetry run pre-commit run --all-files
.
The configuration is stored in .pre-commit-config.yaml
. In that config, there
are links to the repos from which the hooks are pulled, so hop through there if
ou want a detailed description of what each one is doing.
We do not maintain any hooks in this repository.
We're using Poetry
for managing our Python
dependencies and local virtual environments. When it comes to managing the
Python dependencies, there are a couple of things to bear in mind.
For situations where you manually manipulate the pyproject.toml
file, you
should use the make py-lock
command to sync the poetry.lock
file. This will
ensure that you don't inadvertently bring in other transitive dependency updates
that have not been fully tested with the project yet.
If you're just trying to update a dependency to a newer (or the latest) version, you should let Poetry take care of that for you by running the following:
poetry update <dependency> [<dependency>...]
You can specify more than one dependency together. With this command, Poetry will do the following for you:
poetry.lock
fileIn either situation, once you are finished and have verified the dependency
changes are working, please be sure to commit both the pyproject.toml
and
poetry.lock
files.
On M1 Macs, if you get a fatal error: 'Python.h' file not found
message, try a
different method of installing Python. The recommended approach is to use
pyenv
, as noted above in the installation
instructions.
If you're using PyCharm for Python development, we've noticed some quirkiness with the IDE and the interaction between Poetry and virtual environment management that could cause a variety of problems to come up during project setup and dependency management. Other tools, such as Visual Studio Code, have proven to be a smoother experience for folks.
From a terminal within the running devcontainer:
# run all the tests
make test
# continuously run js tests
npm run test-watch
To run a specific JavaScript test, you'll need to copy the full command from
package.json
.
Unlike most of the tests and scans, pa11y-ci cannot currently be run from within the VSCode dev container.
make run-flask
from within the devcontainermake a11y-scan
from your host computer.Work through
commit 543be77
is licensed by the UK government under the MIT license. Work after that commit
is in the worldwide public domain. See LICENSE.md for more
information.
As stated in CONTRIBUTING.md, all contributions to this project will be released under the CC0 dedication. By submitting a pull request, you are agreeing to comply with this waiver of copyright interest.
The Public Benefits Studio is a team inside of GSA’s Technology Transformation Services (TTS), home to innovative programs like 18F and Login.gov. We collaborate with benefits programs to develop shared technology tools and best practices that reduce the burden of navigating government programs for low income individuals and families.
We’re a cross-functional team of technologists with specialized experience working across public benefits programs like Medicaid, SNAP, and unemployment insurance.
For more information on what we're working on, the Notify tool, and how to get involved with our team, see our flyer.
At some point, E2E tests will fail because the secrets held in VCAP_SERVICES have expired. To refresh them, you will need to do the following:
chmod +x print_vcap.sh
./print_vcap.sh