Pagination and Entry Model on Homepage
project.images is an array because you are eager-loading the images.

Since you’re only loading one project entry, you’re not actually gaining anything by eager-loading the images (or category), though. In fact, you’re actually slowing things down a bit. Eager-loading does come with a little bit of overhead, so you should only use it when you’ve got an “n+1” problem, as described on the Eager-Loading Entries page.

So to get this working, just remove the with param.

{% set project = craft.entries()
    .section('projects')
    .orderBy('RAND()')
    .one() %}

{% paginate project.images.limit(1) as images %}


Note that this will also affect how you access your category, as project.category will go from an eager-loaded array, back to a category query.