Tenuki: a new iOS OGS client

Hey all! I’m proud to announce a beta of a new iOS app for accessing OGS.

I know there are already several iOS apps (plus the mobile-friendly website view), but I had a few specific design goals that made building my own app a worthwhile project for me, and I suspect may resonate with others in the community:

  1. Go is a tactile game. I wanted an app that’s more reflective of the visceral experience of slamming slate or shell on wood. I put a lot of effort into visual design, audio design, and integrating iOS haptics.

  2. A puzzle experience designed for mobile. OGS’s full set of puzzle collections is available, with a UI that lets you see both the board and the text at the same time, with the option to download a full puzzle set for offline play.

Today, the app fully supports playing both live and correspondence games at all time controls, finding new matches via automatch, reviewing historic games on your account, and solving puzzles. Games should support all basic game functionality, including basic analysis and basic chat, but more sophisticated analysis or chat features do not work (e.g. creating and sending formal variations or forks, malkovich chat, etc), and Rengo is not yet supported either. There’s a lot missing that I hope to eventually add (some of which — like push notifications — may eventually require some sort of subscription or payment model to cover server costs, but I’m a ways off from even thinking about those logistics), but I’ve been enjoying using this to play games myself for a while now.

It is likely I will open-source the project, but I’m still figuring out details (for those curious, this is a TypeScript + React app, bundled via Capacitor, with quite a bit of custom logic and animation work to make it feel more native). This is built in a way that I can eventually produce both an iPad-specific layout and an Android version, but for now I’m focusing on getting things right for iPhone.

For now, the app is available as a public TestFlight beta. You can install it here: Join the Tenuki beta - TestFlight - Apple

Any feedback is welcome! I expect it to be pretty buggy, going from “two people using it” to “more people use it”.

14 Likes

Hi, really excited for this. Right now i use an ios app called “Surround” to play games from my phone.

For your app, I am having trouble loggin in. I’m attaching screenshots below.
This could be happening because my google accound is linked to my OGS account.

I went to the Surround app, to see how that app handles it. I logged out and tried to log in again.

Surround, takes me to the actual OGS login webpage, and there when i fill-in username/password it takes me to confirm my Google authenticity. And then it brings me back to Surround app.

So my guess is that this 3rd-party auth is not letting me log into Tenuki.


2 Likes

Ahh, yeah, that makes sense, thanks for the bug report and the interest! I’m thankfully already mostly done with switching over to a more “proper” login flow, there was some discussion earlier today that finally gave me the info I needed to fix my implementation ( OAuth2 flow — using authorization grant code? - #5 by Clossius1 ).

Should hopefully have a new build that fixes that in a day or two that opens things up for you!

3 Likes

I also look forward to proper login support, but in the meantime…

Thank you for developing this app! Wow, the puzzle interface is amazing.

Two features I could not find:

  • How do I see the analysis tree for puzzles?
  • How do I activate analysis mode for games?

For both puzzles and games, there’s a magnifying glass icon on the bottom tab bar that brings up the analysis view with a node tree.

Occasionally when you open the analysis view the tree won’t be visible due to a bug. If you close and re-open it, it should eventually show. Working on that, it’s a particularly nasty and non-deterministic bug.

1 Like

I wrote up a big changelog for the latest release, but it turns out external test builds need to go through Apple approval, which can take a day or two. So it’s out of my hands, and I’ll have some change notes for you soon :joy:

1 Like

Hah, that was faster than expected! Version 1.1 should be out at the same TestFlight link as above.

1.1:

  • When viewing a game, briefly replay the most recent move on load
  • Proper support for iOS dynamic text sizing across the app (this also fixes a few instances where the bottom tab bar was inadvertently scrollable)
  • Disable the ability to drag your finger across the game board to place stones and get real-time feedback before lifting your finger. Now that the game view can scroll with larger text sizes instead of always fitting on-screen, being able to drag your finger on the board is interfering with the scroll gesture. If this feels really bad I can write some complex code to handle both scenarios, but I’m trying the simple thing first.
  • Fix kyu ratings to use Math.ceil instead of Math.floor, which lead to off-by-one errors in some situations (thanks to @godeon for pointing out!)
  • Login now supports proper OAuth flow, which should allow people to log in with Google and other third-party providers

One particular thing I’d like feedback on: I rarely need to use custom OS-level text sizes myself. For the larger accessibility-only sizes, I am currently leaving the game board the default size (i.e. as wide as the phone screen). If this matters to you, I’d love to know if this board size is sufficient (either because you can see the whole thing fine, or because you expect to use the iOS system-level ‘zoom’ feature), or if you would prefer to be able to manually zoom and pan the board. Making that happen would be a major hassle, so I’m mostly looking for “no, this is an important feature for me to use the app” than “that sounds neat!”

A small additional note: I previously mentioned wanting to open-source this, but for the time being, it’s unlikely I’m that is going to happen (for unrelated reasons in my personal life that have nothing to do with the app itself or the code). I’m used to writing code in public by default, so this is a shift for me. If anyone is working on their own OGS client or Go app, I’m more than happy to share specific implementation details or code snippets publicly, it’s just unlikely that there’s gonna be a full publicly-accessible GitHub repo for quite a while.

I was able to login, thanks for prompt fixes. I’ll post here if I encounter anything else.

Thanks a lot! One bug I encountered: when writing in the chat, messages from Tenuki always appear as “move 0”.

You can e.g. see this in Freundschaftsspiel , all the “move 0” comments there were made with Tenuki.

1 Like

Thanks for the bug report! Ironically this is one I’ve already fixed but haven’t pushed out a new version for (with a few other improvements to chat), will let you know when that shouldn’t be a problem any more.

1 Like

It’s very simple feedback, but I really like opening the app. Checking my correspondance games is quick and the UI looks clean.

2 Likes

I appreciate it!! I’m making this for myself just as much as for anyone else, but it’s still heartening and motivating to know others are enjoying it :purple_heart:.

New build has been submitted to Apple, will post when it’s been approved and pushed out.

1.2:

Big features:

  • The app now supports live-updating without updating on TestFlight! While the app is in beta, it will proactively prompt you to update, although this will likely be removed before a general public release.
  • Added support for ‘notes’ (the notepad icon in the bottom bar when viewing a game in analysis mode). This is implemented as chat messages in the ‘personal’ channel, which means they are not editable but can be read/written from other clients
  • You can start matches against bots using automatch settings (no full custom settings yet)

Bugfixes, tweaks, small improvements:

  • Chat and notes now show headers for both dates and move numbers.
  • Sending chat messages now properly sends the correct move number.
  • Support rendering chat messages from bots that send their messages in multiple locales (for now, we only support showing in English)
  • The “resign” menu option will instead conditionally say “cancel” (and actually cancel the game instead of resign) if appropriate
  • Looking at a game that has been cancelled will properly show e.g. “White wins by Cancellation” instead of “White wins by [nonsense score]”
  • Fixed text sizing bug causing all text to be ~5% larger than intended
  • Slight styling changes to the game list view
  • Swiping over on a favorited puzzle collection now reveals a ‘download’ button. (This doesn’t yet indicate whether a collection is being downloaded, you still have to go to the separate Downloads page to see)
  • Fixed a handful of animation issues involving page push/pop animations getting into wrong states, especially when auto-progressing correspondence games

Known issues:

  • When starting a bot match, we check for invalid settings before sending off the bot challenge, but we do not yet listen for server notifications about reasons a bot match might fail (e.g. max games being played)
  • Bots that have you place handicap stones wait indefinitely. I suspect this is a general issue where handicap stone placement mode is broken
4 Likes

1.2 should be out on TestFlight! Don’t be surprised if the app asks you to update it shortly after downloading from Apple.

2 Likes

While playing a rapid 9x9 via Tenuki, I just got the message that my opponent won by resignation.
I didn’t resign willfully and do not know how exactly that happened.

Either resignation is much too easy and I accidentally triggered it or some other bug led to this resignation.

Also 9x9 looked a bit strange for me, as Tenuki displayed all 9 star points instead of 5.

So when looking at my player history, I can see that actually my opponent resigned and I won this game. But I really thought I read “white won by resignation”, me being black.

At least it was not obvious to me that I won, maybe this can be made more prominent in the UI :slight_smile:

Sorry for the incorrect report above!

Got your screenshot with the bug showing the wrong winner/resigner! Excited to dig in bd see what’s up.

1 Like

Great app!

Bug report: The wrong board is shown in analysis mode

  • I have the “Auto advance to next game” setting turned on
  • I have three correspondence games waiting for my move, games A B C
  • I make a move on game A
  • I am advanced to game B
  • I tap the magnifying glass to go into analysis mode, but am shown board A.
  • I exit analysis mode and enter it again, now board B is shown
  • I make a move for game B
  • (And if I continue to game C, the same behavior repeats)

Let me know if more detail or a video would be helpful :grin: Thank you for pioneering a new app for OGS.

That’s very helpful, thank you! I’ve noticed that myself occasionally on the latest build, but hadn’t connected the dots that it’s always showing the previous game you auto-progressed from, that should make tracking down the cause much easier.

Thanks!

New build is winding its way through Apple! Ironically it has some changes that require touching the native iOS side, so I can’t use my fancy new auto-updater. Hopefully I’ll get in the habit of shipping more frequently so it’s less likely bugfixes get gated on an Apple review. Will reply when it’s live, hopefully tomorrow.

1.3

Big features:

  • The automatch display has been redesigned, such that if you’re using ‘exact’ or ‘flexible’ time controls, you don’t see the full grid of all possible options. This should make it much more legible on a phone screen.
  • Now properly handles free handicap stone placement at the start of a game
  • Render all custom player flags that OGS supports
  • You can now zoom into a goban by double-tapping or doing a pinch-zoom gesture
  • You can import SGF files!
    • SGF files have a custom analysis view that prioritizes showing comments
    • They can be imported either by pasting from clipboard or picking from a file picker (the “+” button on the Study screen) or by using the ‘Open In’ function from another Go app (if an app prompts you to share an SGF file, clicking ‘more’ on the list of applications should let you select Tenuki).
    • This will be VERY buggy, as SGF files are fairly complex — if you don’t have patience for bugs, leave this alone for now, but if you do find a SGF that breaks it I’d love a copy to test.
    • On the “Study” page, individual imported SGF games can be deleted by swiping, or if you open the top-left menu there is a ‘delete all imported games’ button
  • All game types (OGS games, SGF games, puzzles) now show general game info when you press the ‘info’ button or select the appropriate menu option
  • Should now properly support non-square board sizes

Bugfixes etc:

  • Fixed a bug where games that ended by cancellation or resignation would show the winner based on local score estimation, rather than who actually resigned/cancelled (thanks @Azedo!)
  • Fixed a bug where clicking the analysis button on a game after auto-progressing from a different correspondence game would show the analysis page for the previous game (thanks @mittens!)
  • Some puzzles are flagged as having solutions, and correctly indiate correct answers, but do not explicitly mark incorrect answers. The official OGS client detects this state — leaf node branches in a puzzle with has_solution: true and no correct_answer: true is treated as an incorrect answer. We now handle them the same.

Known issues:

  • As mentioned, importing SGF is currently very buggy
  • If your OS custom text size is large enough that the game view scrolls, you can’t pan around a zoomed-in goban without scrolling the page. It’s really awkward and hard to use.
  • There may be an issue where the number of games you can make a move in on your game list differes from the badge count at the bottom of the screen, someone reported a bug here but I think I might have also touched this code since the last release. If you see a discrepancy here while on the latest version, please let me know! (Thanks to whoever reported this via TestFlight!)
1 Like