DEV Community

KevinTen
KevinTen

Posted on

The 59th Attempt: When Your AR App's "Revolutionary" Idea Meets the Cruel Reality of User Testing

The 59th Attempt: When Your AR App's "Revolutionary" Idea Meets the Cruel Reality of User Testing

Honestly, I'm starting to lose count. At what point do you admit that your "revolutionary" AR app idea might actually be... well, terrible? Let me tell you about my journey building spatial-memory - an app that promised to pin multimedia memories to real-world GPS locations. Spoiler alert: reality has been a bit more... complicated.

The Big Dream: Digital Time Machine

Picture this: You're walking through your old neighborhood, and suddenly you tap a location to see photos and videos from that exact spot. Your graduation ceremony, your first kiss, that time you fell off your bike (let's not relive that one). It was supposed to be like having a digital time machine that follows you everywhere I went.

@RestController
@RequestMapping("/api/memories")
public class MemoryController {

    @PostMapping
    public ResponseEntity<Memory> createMemory(@RequestBody MemoryRequest request) {
        // Save a multimedia memory to exact GPS coordinates
        Memory memory = new Memory(
            request.getUserId(),
            new GeoLocation(request.getLatitude(), request.getLongitude()),
            request.getMediaUrl(),
            request.getTitle(),
            request.getDescription(),
            request.getTags()
        );

        memoryRepository.save(memory);
        return ResponseEntity.ok(memory);
    }

    @GetMapping("/nearby")
    public ResponseEntity<List<Memory>> findMemoriesNearby(
        @RequestParam Double lat,
        @RequestParam Double lng,
        @RequestParam Double radius) {

        // Find memories within radius using spatial database
        return ResponseEntity.ok(memoryRepository.findByLocationNear(
            new GeoLocation(lat, lng), radius));
    }
}
Enter fullscreen mode Exit fullscreen mode

The vision was beautiful. Simple REST API, clean data structures, and then BAM - instant nostalgia wherever you go.

The First Wake-Up Call: GPS "Precision"

Here's where things got interesting. I kept reading about "GPS precision" in tech articles, and I was all excited about millimeter-level accuracy. Turns out, that's only true if you're standing perfectly still with a $50,000 surveying-grade GPS receiver.

In the real world? Let's just say reality has a sense of humor.

GPS Reality Check:

  • Open areas: 3-5 meters of accuracy
  • City centers with tall buildings: 20-30 meters of accuracy
  • Indoors: "Good luck with that, buddy" level of accuracy

So my "exact location" memories were actually memories from "somewhere vaguely around this general area." Not exactly the digital time machine I was imagining.

// WebXR AR client code - supposed to show memories at exact GPS coordinates
const arSession = new XRSession({
    requiredFeatures: ['hit-test'],
    optionalFeatures: ['dom-overlay']
});

arSession.addEventListener('hit-test', (event) => {
    const hitResult = event.results[0];

    // Here's where the magic happens... or doesn't happen
    const userLat = navigator.geolocation.getCurrentPosition(pos => pos.coords.latitude);
    const userLng = navigator.geolocation.getCurrentPosition(pos => pos.coords.longitude);

    // Get memories within 30 meters (because "precision" is relative)
    const nearbyMemories = await fetchMemoriesNearby(userLat, userLng, 30);

    // Now show them... but good luck matching them to actual physical locations
    nearbyMemories.forEach(memory => {
        const anchor = new XRNode('transform', {
            position: hitResult.hitMatrix.transform
        });

        // This is where the user experience gets... creative
        anchor.media = memory.mediaUrl;
        arScene.add(anchor);
    });
});
Enter fullscreen mode Exit fullscreen mode

The result? People standing in a park seeing memories that were supposedly pinned to locations "nearby" - which could mean anything from "that tree over there" to "that building three streets away."

The AR Horror Story

Then came WebXR. Oh, WebXR. You beautiful, complicated mess.

The AR Problems Nobody Tells You About:

  1. Device Compatibility Matrix: My testing devices went something like this:

    • iPhone 12 Pro: Works perfectly
    • Samsung Galaxy S21: Mostly works, colors are weird
    • iPad Air: Crashes after 2 minutes
    • Android budget phone: What's AR?
    • Desktop browser: "We're sorry, AR requires a device with motion sensors"
  2. Battery Consumption: I had a user report that 15 minutes of AR usage drained their battery by 40%. 40%! That's not an app anymore, that's an expensive paperweight.

  3. Performance Nightmares: One device managed to render at 2 FPS. That's not augmented reality, that's augmented slideshow.

/* CSS that doesn't solve the real AR problems */
.ar-container {
    width: 100vw;
    height: 100vh;
    background: transparent;
    position: fixed;
    top: 0;
    left: 0;
    z-index: 1000;
}

/* This looks nice in code but doesn't fix the 2 FPS rendering */
.memory-anchor {
    position: absolute;
    transform: translate3d(0, 0, 0);
    backface-visibility: hidden;
    transform-style: preserve-3d;
}
Enter fullscreen mode Exit fullscreen mode

The Database Nightmare: When 1 Photo Becomes 100 Files

I thought storing photos would be the easy part. I was wrong. So wrong.

Single Photo Storage Reality:

  • Original image: 5MB
  • Optimized web version: 1.5MB
  • Thumbnail: 150KB
  • Metadata JSON: 2KB
  • Access control permissions: 50KB worth of database entries
  • CDN caching metadata: 10KB
  • Version control history: Who keeps track?

Before I knew it, my simple "pin a photo" idea had turned into a multi-terabyte storage and retrieval system.

// The storage service that became a monster
@Service
public class MediaStorageService {

    public void storeMedia(Memory memory, MultipartFile file) {
        // Generate unique filename
        String filename = UUID.randomUUID() + "-" + file.getOriginalFilename();

        // Store original
        s3Client.putObject("spatial-memory/originals", filename, file.getInputStream());

        // Generate and store web-optimized version
        BufferedImage optimized = optimizeImage(file);
        s3Client.putObject("spatial-memory/optimized", filename, convertToStream(optimized));

        // Generate thumbnail
        BufferedImage thumbnail = createThumbnail(optimized);
        s3Client.putObject("spatial-memory/thumbnails", filename, convertToStream(thumbnail));

        // Store metadata (this is where it gets complicated)
        MediaMetadata metadata = new MediaMetadata(
            filename,
            file.getSize(),
            optimized.getWidth(),
            optimized.getHeight(),
            thumbnail.getWidth(),
            thumbnail.getHeight(),
            generateAccessControlList(memory.getUserId()),
            generateCdnConfig()
        );

        metadataRepository.save(metadata);

        // Update memory reference
        memory.setMediaUrl(filename);
        memory.setStorageSize(file.getSize());
        memoryRepository.save(memory);
    }

    private BufferedImage optimizeImage(MultipartFile file) {
        // Complex image processing logic that occasionally crashes
        // because some users upload corrupted files or memes that are 10MB of GIFs
    }
}
Enter fullscreen mode Exit fullscreen mode

The Mobile App Store Rejection Saga

Submitting to app stores was an adventure in itself.

Apple App Store Review Notes:

  • "Your app uses location services in the background. Please explain why."
  • "Your app requests camera permissions. Is this for AR functionality?"
  • "We noticed you have 'pin memories' in your description. Please clarify if users can actually pin memories to physical locations."
  • (After 3 rejections) "Your app now works. Approved."

Google Play Store Review Notes:

  • "Your app requires ARCore. Some devices don't support this. Please indicate compatibility."
  • "Your app requests location permissions. Please explain privacy policy."
  • "We can't reproduce the AR crashes. Approved."

The Brutal Truth: User Testing Results

After spending 6 months building this thing, I finally got some real users to test it. The results were... educational.

User Feedback Highlights:

  • "Cool! But I'm not going to carry my phone around everywhere just for this."
  • "The AR thing kept crashing my phone."
  • "I pinned a memory to my coffee shop, but when I went back the next day, it was showing me memories from across the street."
  • "Battery drain is real. Uninstalling."
  • "Could you make this work without me having to walk around like a tourist?"

The most painful part? Out of 200+ development hours, I got about 20 meaningful user interactions. That's roughly 10 hours of development per meaningful user interaction.

The Unexpected Wins

Despite all the failures, I learned some valuable things:

  1. Advanced Mobile Development Skills: I now know more about mobile performance optimization than I ever wanted to.

  2. Geospatial Database Design: Building spatial queries taught me about the beautiful complexity of geographic data.

  3. AR/VR Development Experience: I've worked with WebXR, ARCore, and ARKit - skills that are surprisingly valuable.

  4. Battery Management: Understanding mobile battery constraints has made me a better developer for all mobile apps.

  5. User Testing Is Everything: My assumptions were completely wrong. The only way to know what users actually want is to ask them.

So Here's the Thing...

At this point, I could either:
A) Keep building the "perfect" AR memory app (spoiler: there's no perfect version)
B) Admit that maybe this idea isn't as revolutionary as I thought
C) Pivot to something more practical based on what I learned

I'm leaning toward option C. The core concept - capturing memories with location context - is interesting, but maybe AR isn't the right delivery method.

Lessons Learned (The Hard Way)

  1. GPS precision is more of a suggestion than a guarantee
  2. AR is cool but has serious practical limitations
  3. Mobile battery life is not a suggestion, it's a hard constraint
  4. Simple ideas can become monstrously complex when you add real-world constraints
  5. User testing should happen BEFORE you spend 6 months building something
  6. Sometimes the best lesson is knowing when to pivot

Pros & Cons (Reality Edition)

Pros:

  • Learned advanced mobile development skills
  • Gained AR/VR development experience
  • Built a solid understanding of geospatial data
  • Discovered that my assumptions were completely wrong (which is valuable)
  • Made some interesting technical discoveries about mobile performance

Cons:

  • 200+ hours of development for minimal user adoption
  • Battery consumption makes the app practically unusable for extended periods
  • GPS accuracy issues make the core feature unreliable
  • AR compatibility issues across devices
  • App store submission challenges
  • High maintenance cost for minimal return

Looking Forward

I'm not giving up on the idea of location-based memories completely, but I'm definitely rethinking the approach. Maybe a web-based solution without heavy AR requirements? Or focusing on indoor spaces where GPS isn't the limiting factor?

What do you think? Have you ever built something that seemed amazing in theory but faced harsh realities in practice? I'd love to hear your stories of beautiful dreams meeting cruel reality.

Drop a comment below - let's commiserate over failed revolutionary ideas that became... well, something else entirely.

Top comments (0)