PageSourceSearch

https://www.structed.me/about

html structed.me collected 2026-09-25 22:36:23 UTC 14,524 bytes, 184 lines download raw bytes

1<!DOCTYPE html>
2<html lang="en">
3
4<head>
5
6  <meta charset="utf-8">
7  <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
8
9  <title>Structed&#x27;s Blog - About Me</title>
10
11  <link rel="canonical" href="https://blog.structed.me/about">
12
13      <link type="application/rss+xml" rel="alternate" href="/feed.rss" />
14      <link type="application/atom+xml" rel="alternate" href="/feed.atom" />
15  
16  <meta name="application-name" content="Structed&#x27;s Blog" />
17  <meta name="msapplication-tooltip" content="Structed&#x27;s Blog" />
18  <meta name="msapplication-starturl" content="/" />
19
20  <meta property="og:title" content="Structed&#x27;s Blog - About Me" />
21    <meta property="og:image" content="https://blog.structed.me/images/virus.jpg" />
22  <meta property="og:type" content="website" />
23  <meta property="og:url" content="https://blog.structed.me/about" />
24  
25  <link rel="shortcut icon" href="/favicon.ico" type="image/x-icon">
26  <link rel="icon" href="/favicon.ico" type="image/x-icon">
27
28  <!-- Bootstrap core CSS -->
29  <link href="/vendor/bootstrap/scss/bootstrap.css" rel="stylesheet">
30
31  <!-- Custom fonts for this template -->
32  <link href="/vendor/fontawesome-free/css/all.min.css" rel="stylesheet" type="text/css">
33  <link href="/vendor/fontawesome-free/css/brands.min.css" rel="stylesheet" type="text/css">
34  <link href='https://fonts.googleapis.com/css?family=Lora:400,700,400italic,700italic' rel='stylesheet' type='text/css' data-no-mirror>
35  <link href='https://fonts.googleapis.com/css?family=Open+Sans:300italic,400italic,600italic,700italic,800italic,400,300,600,700,800' rel='stylesheet' type='text/css' data-no-mirror>
36  
37  <!-- Custom styles for this template -->
38  <link href="/scss/clean-blog.css" rel="stylesheet">
39  
40  
40<script src="https://cdn.jsdelivr.net/npm/[email protected]/components/prism-core.min.js"></script>
40
41  
41<script src="https://cdn.jsdelivr.net/npm/[email protected]/plugins/autoloader/prism-autoloader.min.js" data-no-mirror></script>
41
42  
42<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/quicklink.umd.js"></script>
42
43  <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/[email protected]/themes/prism.css">
44  
45  
46
47<script type="text/javascript">
48    !function(T,l,y){var S=T.location,k="script",D="instrumentationKey",C="ingestionendpoint",I="disableExceptionTracking",E="ai.device.",b="toLowerCase",w="crossOrigin",N="POST",e="appInsightsSDK",t=y.name||"appInsights";(y.name||T[e])&&(T[e]=t);var n=T[t]||function(d){var g=!1,f=!1,m={initialize:!0,queue:[],sv:"5",version:2,config:d};function v(e,t){var n={},a="Browser";return n[E+"id"]=a[b](),n[E+"type"]=a,n["ai.operation.name"]=S&&S.pathname||"_unknown_",n["ai.internal.sdkVersion"]="javascript:snippet_"+(m.sv||m.version),{time:function(){var e=new Date;function t(e){var t=""+e;return 1===t.length&&(t="0"+t),t}return e.getUTCFullYear()+"-"+t(1+e.getUTCMonth())+"-"+t(e.getUTCDate())+"T"+t(e.getUTCHours())+":"+t(e.getUTCMinutes())+":"+t(e.getUTCSeconds())+"."+((e.getUTCMilliseconds()/1e3).toFixed(3)+"").slice(2,5)+"Z"}(),iKey:e,name:"Microsoft.ApplicationInsights."+e.replace(/-/g,"")+"."+t,sampleRate:100,tags:n,data:{baseData:{ver:2}}}}var h=d.url||y.src;if(h){function a(e){var t,n,a,i,r,o,s,c,u,p,l;g=!0,m.queue=[],f||(f=!0,t=h,s=function(){var e={},t=d.connectionString;if(t)for(var n=t.split(";"),a=0;a<n.length;a++){var i=n[a].split("=");
482===i.length&&(e[i[0][b]()]=i[1])}if(!e[C]){var r=e.endpointsuffix,o=r?e.location:null;e[C]="https://"+(o?o+".":"")+"dc."+(r||"services.visualstudio.com")}return e}(),c=s[D]||d[D]||"",u=s[C],p=u?u+"/v2/track":d.endpointUrl,(l=[]).push((n="SDK LOAD Failure: Failed to load Application Insights SDK script (See stack for details)",a=t,i=p,(o=(r=v(c,"Exception")).data).baseType="ExceptionData",o.baseData.exceptions=[{typeName:"SDKLoadFailed",message:n.replace(/\./g,"-"),hasFullStack:!1,stack:n+"\nSnippet failed to load ["+a+"] -- Telemetry is disabled\nHelp Link: https://go.microsoft.com/fwlink/?linkid=2128109\nHost: "+(S&&S.pathname||"_unknown_")+"\nEndpoint: "+i,parsedStack:[]}],r)),l.push(function(e,t,n,a){var i=v(c,"Message"),r=i.data;r.baseType="MessageData";var o=r.baseData;return o.message='AI (Internal): 99 message:"'+("SDK LOAD Failure: Failed to load Application Insights SDK script (See stack for details) ("+n+")").replace(/\"/g,"")+'"',o.properties={endpoint:a},i}(0,0,t,p)),function(e,t){if(JSON){var n=T.fetch;if(n&&!y.useXhr)n(t,{method:N,body:JSON.stringify(e),mode:"cors"});else if(XMLHttpRequest){var a=new XMLHttpRequest;a.open(N,t),a.setRequestHeader("Content-type","application/json"),a.send(JSON.stringify(e))}}}(l,p))}function i(e,t){f||setTimeout(function(){!t&&m.core||a()},500)}var e=function(){var n=l.createElement(k);n.src=h;var e=y[w];return!e&&""!==e||"undefined"==n[w]||(n[w]=e),n.onload=i,n.onerror=a,n.onreadystatechange=function(e,t){"loaded"!==n.readyState&&"complete"!==n.readyState||i(0,t)},n}();y.ld<0?l.getElementsByTagName("head")[0].appendChild(e):setTimeout(function(){l.getElementsByTagName(k)[0].parentNode.appendChild(e)},y.ld||0)}try{m.cookie=l.cookie}catch(p){}function t(e){for(;e.length;)!function(t){m[t]=function(){var e=arguments;g||m.queue.push(function(){m[t].apply(m,e)})}}(e.pop())}var n="track",r="TrackPage",o="TrackEvent";t([n+"Event",n+"PageView",n+"Exception",n+"Trace",n+"DependencyData",n+"Metric",n+"PageViewPerformance","start"+r,"stop"+r,"start"+o,"stop"+o,"addTelemetryInitializer","setAuthenticatedUserContext","clearAuthenticatedUserContext","flush"]),m.SeverityLevel={Verbose:0,Information:1,Warning:2,Error:3,Critical:4};var s=(d.extensionConfig||{}).ApplicationInsightsAnalytics||{};if(!0!==d[I]&&!0!==s[I]){var c="onerror";t(["_"+c]);var u=T[c];T[c]=function(e,t,n,a,i){var r=u&&u(e,t,n,a,i);return!0!==r&&m["_"+c]({message:e,url:t,lineNumber:n,columnNumber:a,error:i}),r},d.autoExceptionInstrumented=!0}return m}(y.cfg);function a(){y.onInit&&y.onInit(n)}(T[t]=n).queue&&0===n.queue.length?(n.queue.push(a),n.trackPageView({})):a()}(window,document,{
49    src: "https://js.monitor.azure.com/scripts/b/ai.2.min.js", // The SDK URL Source
50    // name: "appInsights", // Global SDK Instance name defaults to "appInsights" when not supplied
51    // ld: 0, // Defines the load delay (in ms) before attempting to load the sdk. -1 = block page load and add to head. (default) = 0ms load after timeout,
52    // useXhr: 1, // Use XHR instead of fetch to report failures (if available),
53    crossOrigin: "anonymous", // When supplied this will add the provided value as the cross origin attribute on the script tag
54    // onInit: null, // Once the application insights instance has loaded and initialized this callback function will be called with 1 argument -- the sdk instance (DO NOT ADD anything to the sdk.queue -- As they won't get called)
55    cfg: { // Application Insights Configuration
56        connectionString: "InstrumentationKey=c6d2ff53-bb5e-419a-b0ad-a14645b19e54;IngestionEndpoint=https://northeurope-2.in.applicationinsights.azure.com/"
57    }});
58</script>
58
59
60  
61
62</head>
63
64<body>
65
66  <!-- Navigation -->
67  <nav class="navbar navbar-expand-lg navbar-light fixed-top" id="mainNav">
68  <div class="container">
69    <a class="navbar-brand" href="/">Structed&#x27;s Blog</a>
70    <button class="navbar-toggler navbar-toggler-right" type="button" data-toggle="collapse" data-target="#navbarResponsive" aria-controls="navbarResponsive" aria-expanded="false" aria-label="Toggle navigation">
71      Menu
72      <i class="fas fa-bars"></i>
73    </button>
74    <div class="collapse navbar-collapse" id="navbarResponsive">
75      <ul class="navbar-nav ml-auto">
76            <li class="nav-item">
77                <a class="nav-link" href="/posts">Posts</a>
78            </li>
79            <li class="nav-item">
80                <a class="nav-link" href="/tags">Tags</a>
81            </li>
82            <li class="nav-item">
83                <a class="nav-link" href="/about">About Me</a>
84            </li>
85            <li class="nav-item">
86                <a class="nav-link" href="/imprint">Imprint</a>
87            </li>
88</ul>
89    </div>
90  </div>
91</nav>
92
93  <!-- Page Header -->
94  <header class="masthead" style="background-image: url(&quot;/images/virus.jpg&quot;)">
95  <div class="overlay"></div>
96  <div class="container">
97    <div class="row">
98      <div class="col-md-12">
99        <div class="site-heading">
100          <h1>
101            About Me
102          </h1>
103        </div>
104      </div>
105    </div>
106  </div>
107</header>
108
109  <!-- Main Content -->
110  <div class="container"> 
111    <div class="row">
112      <div id="content" class="col-md-12">  
113        <p><img src="images/Profile.jpg" alt="drawing" width="200" style="float: right; padding-left: 30px;padding-bottom: 30px"/>
114My name is Johannes Ebner - I am a Husband, Dad of two lovely girls and two fluffy cats.
115Since I am a gamer, ex-game developer, ex-backend-developer/SRE/DevOps engineer I know quite a lot about making games, running games as a service, launching them and keeping them alive!
116<p>I have worked with many AAA studios, indie &amp; mobile developers and publishers across Europe and the world and helped them ship games, build online services and saved many of them from the brink of failure.</p>
117<blockquote>
118<p>I'd love to help YOU build your game and make it a success! Contact me <a href="mailto:pelase-useyourname-hereinstead-so-i-can-block-spammers&#64;structed.me">via E-Mail</a>, via <a href="https://linkedin.com/in/johannesebner">LinkedIn</a> or use the embedded contact form below!</p>
119</blockquote>
120<h1 id="reference-projects">Reference Projects</h1>
121<p>A selection of projects I have worked on, either as a freelancer or as an employee, and which I can talk about publicly.</p>
122<h2 id="valheim">Valheim</h2>
123<p>I helped migrate Valheim's multiplayer backend from Steam to PlayFab. My role was to consult <a href="https://www.coffeestainpublishing.com/">Coffee Stain Publishing</a> and <a href="https://www.piktiv.se/">Piktiv</a>, who did the implementation.</p>
124<iframe width="560" height="315" src="https://www.youtube-nocookie.com/embed/l8hxprdWZdI" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>
125<h2 id="godot-playfab">godot-playfab</h2>
126<p>I built <a href="https://github.com/Structed/godot-playfab">godot-playfab</a>, a <a href="https://godotengine.org/">Godot</a> plugin for <a href="https://playfab.com/">PlayFab</a>, which is a cloud backend for games. It is used by more and more studios and games, including <a href="https://rawfury.com/games/dome-keeper/">Dome Keeper</a> by Bippinbits/Raw Fury.</p>
127<h1 id="professional-life-history">Professional Life History</h1>
128<p>I have over 20 years of experience in the IT industry (15 in the games industry), with a focus on software/game development, backend development, DevOps and cloud technologies. I have worked for a variety of companies, from small startups to large corporations, and have been involved in a wide range of projects, from small web applications to large scale cloud services and MMO games.</p>
129<p>Before going freelance, I used to work at <a href="https://microsoft.com/">Microsoft</a> as a <em>Gaming Solution Manager</em> in the <em>Gaming Developer Relations</em> team (formerly: Azure Gaming Global Black Belt Technical Specialist).</p>
130<p>We use to be a team of cloud, backend and game production experts. We know how games are built, what it takes to build games and what the unique challenges are, that studios &amp; publishers face. We help them solve the hard ones with our expertise, products and services and are trusted partners to them.</p>
131<p>If you want to reach out or have a look at my CV, please see my LinkedIn profile at <a href="https://linkedin.com/in/johannesebner">linkedin.com/in/johannesebner</a>.</p>
132<p>You can also contact me via <a href="https://twitter.com/Structed">Twitter</a> or <a href="https://mastodon.social/&#64;structed">Mastodon</a>.</p>
133<h1 id="contact-form">Contact Form</h1>
134<iframe width="640px" height="480px" src="https://forms.office.com/Pages/ResponsePage.aspx?id=DQSIkWdsW0yxEjajBLZtrQAAAAAAAAAAAAMAAK2w3TBUNFNIN1pXR01DVlI2MTYwMVFZQjU1R0UzUy4u&embed=true" frameborder="0" marginwidth="0" marginheight="0" style="border: none; max-width:100%; max-height:100vh" allowfullscreen webkitallowfullscreen mozallowfullscreen msallowfullscreen> </iframe>
135
136      </div>
137    </div>
138  </div>
139
140  <hr>
141
142  <!-- Footer -->  
143  <footer>
144    <div class="container">
145        <div class="row">
146            <div class="col-md-12 text-center">
147                <p class="copyright text-muted m-0">
148                    <a rel="me" href="https://bsky.app/profile/structed.bsky.social"><img src="/images/icons/bluesky-logo.png" width="50" height="50" alt="Bluesky profile" title="Bluesky profile"/>&#64;structed.bsky.social</a>
149                    <a rel="me" href="https://mastodon.social/&#64;structed"><img src="/images/icons/mastodon_icon.jpg" width="50" height="50" alt="Mastodon profile" title="Mastodon profile"/>[email protected]</a>
150                    <a rel="me" href="https://twitter.com/structed"><img src="/images/icons/twitter_icon.png" width="50" height="50" alt="Twitter Profile" title="Twitter Profile"/>&#64;structed</a>
151                    <a rel="me" href="https://github.com/structed"><img src="/images/icons/github_icon.png" width="50" height="50" alt="GitHub Profile" title="GitHub Profile"/>&#64;structed</a>
152                </p>
153                <p class="copyright text-muted m-0">Copyright &#xA9; Johannes Ebner 2024</p>
154                <br/>
155                <ul class="list-inline text-center small">
156                        <li class="list-inline-item">
157                            <a href="/feed.rss"><i class="fa fa-rss"></i> RSS Feed</a>
158                        </li>
159                        <li class="list-inline-item">
160                            <a href="/feed.atom"><i class="fa fa-rss"></i> Atom Feed</a>
161                        </li>
162                </ul>
163                <br/>
164                <div class="font-weight-bold small"><a href="https://statiq.dev">Generated by Statiq</a></div>
165            </div>
166        </div>
167    </div>
168</footer>
169
170  <!-- Bootstrap core JavaScript -->
171  
171<script src="/vendor/jquery/jquery.min.js"></script>
171
172  
172<script src="/vendor/bootstrap/js/bootstrap.bundle.min.js"></script>
172
173
174  
175
176
177  
178
179  <!-- Custom scripts for this template -->
180  
180<script src="/js/clean-blog.js"></script>
180
181
182</body>
183
184</html>

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.