Phoenix Portfolio Template
Legacy Template — maintained for security and compatibility fixes only. No new features. EOL review: July 2027. See LEGACY-STATUS.md. For actively developed starters, see the core PHX products at phxtemplates.com.
A single-page developer portfolio built with Phoenix 1.7 and LiveView 0.19:
- Sticky sidebar with jump-link navigation (About / Experience / Projects / Contact) and a LiveView-driven active-section highlight.
-
Experience timeline and project cards driven by plain Elixir data in
lib/portfolio_template_web/live/home_live/index.ex— no database content to manage. - Contact form wired for EmailJS (client-side, placeholder credentials shipped — nothing sends until you add yours).
- Optional Buy Me a Coffee widget (disabled until you set your id).
- Ships with the demo persona “Alex Rivera” — all demo content is redistributable placeholder copy for you to replace.
Why is there auth code if the site has no login?
The public portfolio needs no accounts, so no auth routes ship enabled.
The full phx.gen.auth implementation (Accounts context, UserAuth plug,
auth LiveViews, users migration) is retained so you can add a private/admin
area later by uncommenting the scopes in
lib/portfolio_template_web/router.ex. If you will never need it, it is safe
to delete those modules, the pbkdf2_elixir dependency, and the users
migration. There are no billing or background-job (Oban) dependencies.
Install
Requirements: Elixir >= 1.15 / OTP 25+, PostgreSQL 12+. Node is not required (esbuild/tailwind binaries are fetched by mix). Postgres is only used by the (optional) auth scaffolding — the portfolio content itself is code-defined.
mix setup # deps, database, assets
mix phx.server # visit http://localhost:4000
The dev/test database reads DB_PORT (default 5432) if your Postgres runs on
a non-standard port.
Run the test suite:
mix test
Customize
All sample content lives in
lib/portfolio_template_web/live/home_live/index.ex:
-
Name, headline, description —
@name,@description, plus the headline text inhome_live/index.html.heex. -
Experience — edit the
@experienceslist (title, employer, dates, description, tech stack, link). -
Projects — edit the
@projectslist. Images can be local files underpriv/static/images/projects/or external URLs. -
Contact form (EmailJS) — create a free EmailJS account and put your
service ID, template ID, and public key into
assets/js/mailer.js(placeholders are clearly marked:service_id_here,template_id_here,public_key_here). No server-side email is involved. -
Buy Me a Coffee — set
buymeacoffee_idinHomeLive.Index.mount/3; the widget stays off while the id is empty. -
Social links — the sidebar icons point to
#; set your profiles or remove them.
Deploy
Standard Phoenix release deployment. In production you must set:
-
DATABASE_URL(e.g.ecto://USER:PASS@HOST/DATABASE) -
SECRET_KEY_BASE(generate withmix phx.gen.secret) -
PHX_HOST, andPHX_SERVER=truewhen starting a release
mix assets.deploy
MIX_ENV=prod mix release
See the Phoenix deployment guides for platform specifics (Fly.io, Gigalixir, Docker, bare VMs).
Support & policies
- LEGACY-STATUS.md — maintenance policy and EOL review
- SUPPORT.md — how to get help
- SECURITY.md — reporting vulnerabilities
- CHANGELOG.md — release history