A multi-device display for showing interactive data, such as photos, weather information, calendar appointments, and more.
CellWall is my project to repurpose a batch of old hand-me-down cell phones into a useful display in my apartment. It uses ADB to let each phone connect to a server and receive data about what to show.
Putting the hardware together
The hardware boils down to a bunch of cell phones stuck onto a plank of wood, with USB cables connecting them to a server. A detailed run-through is coming soon.
Wood plank (the "Wall")
- Plywood handy panel
- White acrylic paint
- Paint brush
- Tools to mount the plank onto your wall, such as:
Mounting and connecting the phones (the "Cell"s)
- Old cell phones and/or tablets running Android
- Raspberry Pi or another computer to use as the server
- Velcro strips
- USB cables
- Wire clips
- USB hub
Note that most of these links are affiliate links for Amazon. As an Amazon Associate I earn from qualifying purchases. Using these links helps out the project!
Using the software
These instructions will get you a copy of the project up and running on your local machine for development and testing purposes.
- Node.js 16 or greater
- Android Studio 4.1 or greater
- Android Debug Bridge
Install Node dependencies for the server:
Install Gradle dependencies for the client by opening the
./android folder as
an Android Studio project and syncing Gradle.
Alternatively, from the command line:
cd ./android gradlew build
Test locally in development environment by spinning up two servers: client & server.
pnpm --filter server run dev pnpm --filter client run dev
The server communicates with phones over ADB. ADB should be installed and the phones should be in debug mode. Check that all phones appear when running
Run the server by compiling the TypeScript code and launching it with node:
pnpm -r run build pnpm -w start
A production build is available on the
pi-deploy branch. It can be started by running:
pnpm install --frozen-lockfile --prod pnpm -w start
Some paths and API keys are set via environment variables. The project uses
dotenv, so an
.env file will automatically be loaded by the server.
See env.ts for a list of environment variables.