A restart loop hides the error that caused it
systemctl status showed activating (auto-restart) with a changing main PID and a wall of logs. The actual error had been flushed away.
Stop the loop first, then look:
systemctl stop app
journalctl -u app --no-pager -n 100
Without the restarts, the first error is usually the cause: a taken port, a syntax error, a missing file, wrong permissions.
Also check RestartSec. The default is 100 ms; with Restart=always a service that always fails restarts ten times a second until StartLimitBurst trips and systemd gives up. Five seconds or more keeps the logs readable and the CPU idle.