Start Here 
Basic sample, user avatar
sh
node ace add @jrmc/adonis-attachmentsh
# Create a new migration file
node ace make:migration change_avatar_column_to_json --table=usersts
// Within the migration file
protected tableName = 'users'
public async up() {
  this.schema.alterTable(this.tableName, (table) => {
    table.json('avatar').alter() 
  })
}ts
// start/routes.ts
import router from '@adonisjs/core/services/router'
router.attachments() ts
// app/models/user.ts
import { BaseModel } from '@adonisjs/lucid/orm'
import { attachment } from '@jrmc/adonis-attachment'
import type { Attachment } from '@jrmc/adonis-attachment/types/attachment'
class User extends BaseModel {
  @attachment() 
  declare avatar: Attachment
}ts
// app/controllers/users_controller.ts
import { attachmentManager } from '@jrmc/adonis-attachment'
class UsersController {
  public store({ request }: HttpContext) {
    const avatar = request.file('avatar')!
    const user = new User()
    user.avatar = await attachmentManager.createFromFile(avatar) 
    await user.save()
  }
}edge
<img src="/attachments/{{ user.avatar.keyId }}" loading="lazy" alt="" />Thumbnail
sh
npm install sharpsh
pnpm install sharpsh
yarn add sharpts
// config/attachment.ts
import { defineConfig } from '@jrmc/adonis-attachment'
import { InferConverters } from '@jrmc/adonis-attachment/types/config'
const attachmentConfig = defineConfig({
  converters: {
    thumbnail: { 
      format: 'webp', 
      resize: 300, 
    } 
  }
})
...edge
<img src="/attachments/{{ user.avatar.keyId }}?variant=thumbnail" loading="lazy" alt="" />