How to add a new button to CMS

I’ve managed to do this by extending the GridFieldDetailForm_ItemRequest because that one is responsible for rendering the edit form in the grin (surprise!)

SilverStripe\Forms\GridField\GridFieldDetailForm_ItemRequest:
  extensions:
    - App\Extensions\TargetClassActions
<?php
namespace App\Extensions;

use SilverStripe\Control\Controller;
use SilverStripe\Core\Extension;
use SilverStripe\Forms\FieldList;
use SilverStripe\Forms\GridField\GridFieldDetailForm_ItemRequest;
use SilverStripe\Forms\LiteralField;

/**
 * @property-read GridFieldDetailForm_ItemRequest $owner
 */
class TargetClassActions extends Extension {


    public function updateFormActions(FieldList $actions)
    {
        $targetClass = TargetClass::class;
        $record = $this->owner->getRecord();
        if($record && $record->exists() && $record->ClassName == $targetClass) {
            $action = 'newaction';
            $classDesc = str_replace('\\','-',$targetClass);
            $link = '/'.Controller::curr()->Link("$classDesc/$action/{$record->ID}");

            $actions->push(
                LiteralField::create('Literal_'.$action,'<a target="_blank" href="'.$link.'" class="btn btn-outline-secondary">Download Unclaimed tokens</a>')
            );
        }
    }
}
<?php
namespace App\Admin;

use SilverStripe\Admin\ModelAdmin;
use SilverStripe\Control\HTTPRequest;

class TargetClassAdmin extends ModelAdmin
{

    private static $allowed_actions = [
        'newaction',
    ];
    private static $url_handlers = [
        'newaction/$ID' => 'newaction',
    ];

    private static $managed_models = [
        TargetClass::class,
    ];

    public function newaction(HTTPRequest $request)
    {
        $params = $request->match('$ID');

        //do the stuff
    }

}