I turned my house into a IPv6 lab back in 2012. I also studied some of the RFCs that were available at the time and learned some things. IPv6 is not an update of IPv4 with a larger address space. Some philosophies are fundamentally different.
I'll put what I learned below. Firmware support for v6 has no doubt come a long way since then, so people who have done this recently can feel free to (and should) publicly disagree with me.
1. Hosts Should Be on /64 SubnetsYou can absolutely assign something smaller than a /64 to a host, but the protocol seems to have been built with /64 as the preferred size. This lets you use SLAAC (stateless auto-configuration).
I have come to prefer using SLAAC+DHCPv6. That is, anything that supports IPv6 can self-configure using SLAAC, and most hosts will be able to pull down more useful information via DHCPv6. This way, hosts can still have basic functionality if all they support is SLAAC, which was the case for earlier versions of Android.
2. Assign a ULA SubnetAssign your network a ULA. These subnets start with FD__:.... and are /48 in length. Each IPv6 host on your network should then self-configure both a global prefix (2600:: or some such) in addition to the ULA. (EDIT: Servers can and probably should have statically-assigned ULA addresses.)
In this way, if you change ISPs, your ULA remains in-tact and host-to-host communication over IPv6 doesn't have to be impacted.
Randomly generate the ULA out to /48. Do not do something like fd00::/48. In this way, you can virtually guarantee that you can VPN your ULA with someone else's and the address spaces won't clash.
Unique Local IPv6 GeneratorI'll be watching this thread for activity.