A minimalist personal portfolio website built with Phoenix Framework, displaying professional information and contact links.
This project is a simple, single-page Phoenix application that serves as a personal portfolio and resume website. It features:
- Professional profile display with photo
- Downloadable resume (PDF)
- Links to professional profiles (GitHub, LinkedIn, StackOverflow)
- Clean, responsive design using Tailwind CSS
- Backend: Elixir 1.14+ with Phoenix Framework 1.7.21
- Frontend: Phoenix HTML/HEEx templates with Tailwind CSS
- Asset Building: ESBuild for JavaScript, Tailwind CLI for CSS
- Database: PostgreSQL (configured but not actively used)
- Deployment: Fly.io with Docker containerization
- Elixir ~> 1.14
- Erlang/OTP 26
- Node.js (for asset compilation)
- PostgreSQL (if enabling database features)
- Docker (for deployment)
- Fly CLI (for deployment to Fly.io)
-
Clone the repository
git clone <repository-url> cd blog
-
Install dependencies
mix deps.get
-
Install Node.js dependencies
cd assets && npm install cd ..
-
Set up the database (optional - not required for current functionality)
mix ecto.setup
-
Start the Phoenix server
mix phx.server
Or run inside IEx:
iex -S mix phx.server
-
Visit the application
- Navigate to
http://localhost:4000 - Development dashboard available at
http://localhost:4000/dashboard
- Navigate to
blog/
├── assets/ # Frontend assets (CSS, JS)
├── config/ # Application configuration
├── lib/
│ ├── blog/ # Business logic (minimal)
│ └── blog_web/ # Web layer (controllers, templates, etc.)
├── priv/
│ ├── static/ # Static files (images, PDFs)
│ └── repo/ # Database migrations (none currently)
├── test/ # Test files
├── Dockerfile # Docker configuration
├── fly.toml # Fly.io deployment configuration
└── mix.exs # Project dependencies and configuration
Create a .env file or set these environment variables:
# Required for production
SECRET_KEY_BASE=<generate-with-mix-phx.gen.secret>
PHX_HOST=<your-domain-or-fly-app-name.fly.dev>
# Optional database configuration
DATABASE_URL=<postgresql-connection-string>To update the portfolio content:
- Profile Image: Replace
/priv/static/images/yosemite.jpg - Resume PDF: Replace
/priv/static/docs/resume.pdf - Social Links: Edit
/lib/blog_web/controllers/page_html/home.html.heex
-
Install Fly CLI
curl -L https://fly.io/install.sh | sh -
Login to Fly
fly auth login
-
Create the app (if not already created)
fly apps create withered-forest-1852
-
Set secrets
fly secrets set SECRET_KEY_BASE=$(mix phx.gen.secret)
-
Deploy the application
fly deploy
-
Check deployment status
fly status
-
View logs
fly logs
The fly.toml file configures:
- Auto-scaling: Scales down to 0 machines when not in use (cost-effective)
- Health checks: Monitors the root path every 10 seconds
- HTTPS: Automatically enforces HTTPS
- Region: Deployed to
sea(Seattle) region by default
# Scale the application
fly scale count 1 # Ensure at least one instance running
fly scale count 0 # Allow scaling to zero
# SSH into the running instance
fly ssh console
# Open the application in browser
fly open
# View recent deployments
fly releasesmix testmix formatAssets are automatically built in development. For production builds:
MIX_ENV=prod mix assets.deployThe project has Ecto and PostgreSQL configured but not actively used. To add database features:
- Create migrations:
mix ecto.gen.migration <migration_name> - Update
lib/blog/application.exto start the Repo supervisor - Provision a PostgreSQL database on Fly.io:
fly postgres create
mix deps.update --all
cd assets && npm update- Production logs:
fly logs - Application metrics:
fly dashboard - Local development dashboard:
http://localhost:4000/dashboard
[Add your license information here]
- GitHub: https://github.com/vaer-k
- LinkedIn: https://www.linkedin.com/in/vincent-raerek/
- StackOverflow: https://stackoverflow.com/users/1154287/vaer-k