diff --git a/include/rive/artboard.hpp b/include/rive/artboard.hpp
index 2dfc2f5..34def2f 100644
--- a/include/rive/artboard.hpp
+++ b/include/rive/artboard.hpp
@@ -23,6 +23,7 @@
     class NestedArtboard;
     class ArtboardInstance;
     class LinearAnimationInstance;
+    class Scene;
     class StateMachineInstance;
 
     class Artboard : public ArtboardBase, public CoreContext, public ShapePaintContainer {
@@ -120,17 +121,18 @@
         size_t stateMachineCount() const { return m_StateMachines.size(); }
         std::string stateMachineNameAt(size_t index) const;
 
-        LinearAnimation* firstAnimation() const;
+        LinearAnimation* firstAnimation() const { return animation(0); }
         LinearAnimation* animation(const std::string& name) const;
         LinearAnimation* animation(size_t index) const;
 
-        StateMachine* firstStateMachine() const;
+        StateMachine* firstStateMachine() const { return stateMachine(0); }
         StateMachine* stateMachine(const std::string& name) const;
         StateMachine* stateMachine(size_t index) const;
 
         /// When provided, the designer has specified that this artboard should
-        /// always autoplay this StateMachine.
-        StateMachine* defaultStateMachine() const;
+        /// always autoplay this StateMachine. Returns -1 if it was not
+        // provided.
+        int defaultStateMachineIndex() const;
 
         /// Make an instance of this artboard, must be explictly deleted when no
         /// longer needed.
@@ -164,7 +166,18 @@
 
         std::unique_ptr<StateMachineInstance> stateMachineAt(size_t index);
         std::unique_ptr<StateMachineInstance> stateMachineNamed(const std::string& name);
-        std::unique_ptr<StateMachineInstance> defaultStateMachineInstance();
+
+        /// When provided, the designer has specified that this artboard should
+        /// always autoplay this StateMachine instance. If it was not specified,
+        /// this returns nullptr.
+        std::unique_ptr<StateMachineInstance> defaultStateMachine();
+
+        // This attemps to always return *something*, in this search order:
+        // 1. default statemachine instance
+        // 2. first statemachine instance
+        // 3. first animation instance
+        // 4. nullptr
+        std::unique_ptr<Scene> defaultScene();
     };
 } // namespace rive
 
diff --git a/skia/viewer/src/main.cpp b/skia/viewer/src/main.cpp
index 2818f58..16d1096 100644
--- a/skia/viewer/src/main.cpp
+++ b/skia/viewer/src/main.cpp
@@ -45,6 +45,8 @@
 std::vector<std::string> animationNames;
 std::vector<std::string> stateMachineNames;
 
+constexpr int REQUEST_DEFAULT_SCENE = -1;
+
 #include <time.h>
 double GetSecondsToday() {
     time_t m_time;
@@ -89,8 +91,6 @@
 }
 
 void initStateMachine(int index) {
-    stateMachineIndex = index;
-    animationIndex = -1;
     assert(fileBytes.size() != 0);
     auto file = rive::File::import(rive::toSpan(fileBytes), &skiaFactory);
     if (!file) {
@@ -98,6 +98,9 @@
         fprintf(stderr, "failed to import file\n");
         return;
     }
+
+    stateMachineIndex = -1;
+    animationIndex = -1;
     currentScene = nullptr;
     artboardInstance = nullptr;
 
@@ -106,8 +109,24 @@
     artboardInstance->advance(0.0f);
     loadNames(artboardInstance.get());
 
-    if (index >= 0 && index < artboardInstance->stateMachineCount()) {
+    if (index < 0) {
+        currentScene = artboardInstance->defaultStateMachine();
+        index = artboardInstance->defaultStateMachineIndex();
+    }
+    if (!currentScene) {
+        if (index >= artboardInstance->stateMachineCount()) {
+            index = 0;
+        }
         currentScene = artboardInstance->stateMachineAt(index);
+    }
+    if (!currentScene) {
+        index = -1;
+        currentScene = artboardInstance->animationAt(0);
+        animationIndex = 0;
+    }
+    stateMachineIndex = index;
+
+    if (currentScene) {
         currentScene->inputCount();
     }
 }
@@ -175,7 +194,7 @@
         fprintf(stderr, "failed to read all of %s\n", filename.c_str());
         return;
     }
-    initAnimation(0);
+    initStateMachine(REQUEST_DEFAULT_SCENE);
 }
 
 int main() {
diff --git a/src/artboard.cpp b/src/artboard.cpp
index 58e9cae..349e81e 100644
--- a/src/artboard.cpp
+++ b/src/artboard.cpp
@@ -481,13 +481,6 @@
     return sm ? sm->name() : nullptr;
 }
 
-LinearAnimation* Artboard::firstAnimation() const {
-    if (m_Animations.empty()) {
-        return nullptr;
-    }
-    return m_Animations.front();
-}
-
 LinearAnimation* Artboard::animation(const std::string& name) const {
     for (auto animation : m_Animations) {
         if (animation->name() == name) {
@@ -504,13 +497,6 @@
     return m_Animations[index];
 }
 
-StateMachine* Artboard::firstStateMachine() const {
-    if (m_StateMachines.empty()) {
-        return nullptr;
-    }
-    return m_StateMachines.front();
-}
-
 StateMachine* Artboard::stateMachine(const std::string& name) const {
     for (auto machine : m_StateMachines) {
         if (machine->name() == name) {
@@ -527,11 +513,12 @@
     return m_StateMachines[index];
 }
 
-StateMachine* Artboard::defaultStateMachine() const {
-    if (defaultStateMachineId() >= m_StateMachines.size()) {
-        return nullptr;
+int Artboard::defaultStateMachineIndex() const {
+    int index = defaultStateMachineId();
+    if ((size_t)index >= m_StateMachines.size()) {
+        index = -1;
     }
-    return m_StateMachines[defaultStateMachineId()];
+    return index;
 }
 
 std::unique_ptr<ArtboardInstance> Artboard::instance() const {
@@ -617,7 +604,18 @@
     return sm ? std::make_unique<StateMachineInstance>(sm, this) : nullptr;
 }
 
-std::unique_ptr<StateMachineInstance> ArtboardInstance::defaultStateMachineInstance() {
-    auto sm = this->defaultStateMachine();
-    return sm ? std::make_unique<StateMachineInstance>(sm, this) : nullptr;
+std::unique_ptr<StateMachineInstance> ArtboardInstance::defaultStateMachine() {
+    const int index = this->defaultStateMachineIndex();
+    return index >= 0 ? this->stateMachineAt(index) : nullptr;
+}
+
+std::unique_ptr<Scene> ArtboardInstance::defaultScene() {
+    std::unique_ptr<Scene> scene = this->defaultStateMachine();
+    if (!scene) {
+        scene = this->stateMachineAt(0);
+    }
+    if (!scene) {
+        scene = this->animationAt(0);
+    }
+    return scene;
 }
\ No newline at end of file
