Release 1.18 removed the 1 MB limit on uploadable files, as it now uses the blobstore service of App Engine. It also fixes a bug that prevented it from working with the current version of the App Engine SDK's development server. Release 1.18.3 fixed a bug that prevented file upload from working in subdomains ("My projects"). It also corrects the location of the tiddler comments to be inside the collapsable tiddler area.
Release 1.18.6 fixed a bug that prevented the use of non-ascii characters in page titles. Previously, you were allowed to create such page, but you could not access it, since the URL was not properly understood.

''NB: This version requires Python 2.7 and the Google App Engine SDK for Python.''
If you wondered about the name giewiki, the current explanation goes like this:
* The g stands for google-appengine-based, obviously.
* The wiki part is easy: that's what it  is.
* The first e is there because //gwiki// sounds like it's there.
* The //i// before that is there in honour of the good old english spelling rule "//i// before //e// except after c".
My neigborhood park is the home of many feathered creatures, particularly of the family Anatidae.
[[More feathered sillyness|]]
In the Page properties dialog, click 'define group' to open a second dialog where you specify the name of your user group, and click add (if you have already done this, it will appear in the drop-down menu top-left titled 'group').

Having defined (or selected) a group, you can add members to it using the lower part of the dialog. Specify each member's google login (email address excluding the part for gmail accounts; or, for non-gmail accounts, the full login email).

Once you have defined a group and it's members, you just have to specify the group name in the Page properties dialog, and define the privilege level of the group using the drop-down at the bottom-left of the dialog.
<<youtube j7dmGEqZFS0 -570,60%>>
Version 1.8 adds support for offline editing and upload via TiddlyWiki's sync facility: 
# On the page you want to edit offline, open the options panel and right-click Download TiddlyWiki and save it wherever you want. This will give you a standard TiddlyWiki with all the contents of the page, as before, but with the addition of the GiewikiAdaptor plugin. Currently, I do not include the ~TiddlySaver.jar file which is needed if you use Safari or Chrome; you will have to get that from if you don't have it already (put it next to your HTML file).
# Do your offline editing classic TiddlyWiki style.
# When you want to upload your changes (and additions), open the ''Backstage'' menu (at the very top right), and choose ''sync'', then sync the tiddlers that you have changed.
# This should give you a message with a link saying 'Please __authenticate your post__'. You need to click this link, which takes you to the online page in order to authenticate your uploaded tiddlers. Until you do, they are not accessible from the server. The reason I need to do it this way is that the authentication method uses your google account, and there is no way to do the google login except via the web site.
Use this feature with real caution, and -specifically- do //not// put any HTML that you haven't written or explicitly trust into the same folder with TiddlySaver.jar. //The jeopardy ''if you aren't careful'' is the reason I am not terribly happy with this solution.//

Current limitations/bugs that I hope to remove are the ones that follow from using unmodified ~TiddlyWiki code: If you rename a tiddler, the link to the online version appears to be broken, although it actually isn't; the server-side identifies the tiddler by a unique id, not by its title.
The Version 1.8 download is [[|]]. This solution does not, regrettably, help those who use giewiki on their iPads. This will require that I replace TiddlyWiki's storage mechanism with a solution based on [[HTML5 client-side storage|]]. That should be a priority project for 2011. 
Adding a ? as the first parameter to a macro (any?)  and clicking preview should produce help on using that macro, eg: {{{<<someMacro ?>>}}}.
In my humble opinion, of course...
You currently have two ways to use it, both of which are free:
* If you prefer, you can run it locally on your own computer, any kind for which a PythonInterpreter exists. Besides python, you will need the [[Google App Engine SDK for Python|]], also free. You will want to do this if you need to work offline, or you intend to store very sensitive information. To this end, you will need to get the giewiki [[source code|Download (Source code)]] //(but don't worry, no assembly required)//.
* You can run it in //the cloud//, that is Google's web-based App Engine hosting enviroment. This lets you access giewiki on any device, tablet, computer or phone, that has internet access. In this way, you can easily share information with others, or collect information from an audience. Google will let you create up to 10 subdomains of, and for moderate demands, it is absolutely free. Check out for more information.

/% You may try it out by creating your own subdomains of [via //<login name>// - my profile - my projects -Add], although I cannot guarantee that it will not eventually be deleted. %/

For those who need to use it both ways, there should be facilities for automatic replication of content between the two environments. This is high on my list of toDo's.
The excludeLists attribute (tag) can be applied to tiddlers that are unfit as reading entry points - either because they are part of a larger story, or simply because they only serve a technical purpose - as such it should probably be applied to most systemConfig tiddlers most of the time.
[[She carefully guided her young ones|!i=2502415641]] through the park, stopping every few seconds to look back and check that they were all close. She didn't get very far though before she was spotted by someone else....
<html><iframe width="560" height="315" src="" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe></html>
|''Description:''|Adobe Flash Embedding|
|''Date:''|Aug 22, 2010|
|''License:''|[[MIT open source license]]|
|''Browser:''|Chrome; Safari; Firefox; InternetExplorer 6.0|


//	SWFObject v2.2 (
//	is released under the MIT License (

var swfobject=function(){var D="undefined",r="object",S="Shockwave Flash",W="ShockwaveFlash.ShockwaveFlash",q="application/x-shockwave-flash",R="SWFObjectExprInst",x="onreadystatechange",O=window,j=document,t=navigator,T=false,U=[h],o=[],N=[],I=[],l,Q,E,B,J=false,a=false,n,G,m=true,M=function(){var aa=typeof j.getElementById!=D&&typeof j.getElementsByTagName!=D&&typeof j.createElement!=D,ah=t.userAgent.toLowerCase(),Y=t.platform.toLowerCase(),ae=Y?/win/.test(Y):/win/.test(ah),ac=Y?/mac/.test(Y):/mac/.test(ah),af=/webkit/.test(ah)?parseFloat(ah.replace(/^.*webkit\/(\d+(\.\d+)?).*$/,"$1")):false,X=!+"\v1",ag=[0,0,0],ab=null;if(typeof t.plugins!=D&&typeof t.plugins[S]==r){ab=t.plugins[S].description;if(ab&&!(typeof t.mimeTypes!=D&&t.mimeTypes[q]&&!t.mimeTypes[q].enabledPlugin)){T=true;X=false;ab=ab.replace(/^.*\s+(\S+\s+\S+$)/,"$1");ag[0]=parseInt(ab.replace(/^(.*)\..*$/,"$1"),10);ag[1]=parseInt(ab.replace(/^.*\.(.*)\s.*$/,"$1"),10);ag[2]=/[a-zA-Z]/.test(ab)?parseInt(ab.replace(/^.*[a-zA-Z]+(.*)$/,"$1"),10):0}}else{if(typeof O.ActiveXObject!=D){try{var ad=new ActiveXObject(W);if(ad){ab=ad.GetVariable("$version");if(ab){X=true;ab=ab.split(" ")[1].split(",");ag=[parseInt(ab[0],10),parseInt(ab[1],10),parseInt(ab[2],10)]}}}catch(Z){}}}return{w3:aa,pv:ag,wk:af,ie:X,win:ae,mac:ac}}(),k=function(){if(!M.w3){return}if((typeof j.readyState!=D&&j.readyState=="complete")||(typeof j.readyState==D&&(j.getElementsByTagName("body")[0]||j.body))){f()}if(!J){if(typeof j.addEventListener!=D){j.addEventListener("DOMContentLoaded",f,false)}if({j.attachEvent(x,function(){if(j.readyState=="complete"){j.detachEvent(x,arguments.callee);f()}});if(O==top){(function(){if(J){return}try{j.documentElement.doScroll("left")}catch(X){setTimeout(arguments.callee,0);return}f()})()}}if(M.wk){(function(){if(J){return}if(!/loaded|complete/.test(j.readyState)){setTimeout(arguments.callee,0);return}f()})()}s(f)}}();function f(){if(J){return}try{var Z=j.getElementsByTagName("body")[0].appendChild(C("span"));Z.parentNode.removeChild(Z)}catch(aa){return}J=true;var X=U.length;for(var Y=0;Y<X;Y++){U[Y]()}}function K(X){if(J){X()}else{U[U.length]=X}}function s(Y){if(typeof O.addEventListener!=D){O.addEventListener("load",Y,false)}else{if(typeof j.addEventListener!=D){j.addEventListener("load",Y,false)}else{if(typeof O.attachEvent!=D){i(O,"onload",Y)}else{if(typeof O.onload=="function"){var X=O.onload;O.onload=function(){X();Y()}}else{O.onload=Y}}}}}function h(){if(T){V()}else{H()}}function V(){var X=j.getElementsByTagName("body")[0];var aa=C(r);aa.setAttribute("type",q);var Z=X.appendChild(aa);if(Z){var Y=0;(function(){if(typeof Z.GetVariable!=D){var ab=Z.GetVariable("$version");if(ab){ab=ab.split(" ")[1].split(",");M.pv=[parseInt(ab[0],10),parseInt(ab[1],10),parseInt(ab[2],10)]}}else{if(Y<10){Y++;setTimeout(arguments.callee,10);return}}X.removeChild(aa);Z=null;H()})()}else{H()}}function H(){var ag=o.length;if(ag>0){for(var af=0;af<ag;af++){var Y=o[af].id;var ab=o[af].callbackFn;var aa={success:false,id:Y};if(M.pv[0]>0){var ae=c(Y);if(ae){if(F(o[af].swfVersion)&&!(M.wk&&M.wk<312)){w(Y,true);if(ab){aa.success=true;aa.ref=z(Y);ab(aa)}}else{if(o[af].expressInstall&&A()){var ai={};[af].expressInstall;ai.width=ae.getAttribute("width")||"0";ai.height=ae.getAttribute("height")||"0";if(ae.getAttribute("class")){ai.styleclass=ae.getAttribute("class")}if(ae.getAttribute("align")){ai.align=ae.getAttribute("align")}var ah={};var X=ae.getElementsByTagName("param");var ac=X.length;for(var ad=0;ad<ac;ad++){if(X[ad].getAttribute("name").toLowerCase()!="movie"){ah[X[ad].getAttribute("name")]=X[ad].getAttribute("value")}}P(ai,ah,Y,ab)}else{p(ae);if(ab){ab(aa)}}}}}else{w(Y,true);if(ab){var Z=z(Y);if(Z&&typeof Z.SetVariable!=D){aa.success=true;aa.ref=Z}ab(aa)}}}}}function z(aa){var X=null;var Y=c(aa);if(Y&&Y.nodeName=="OBJECT"){if(typeof Y.SetVariable!=D){X=Y}else{var Z=Y.getElementsByTagName(r)[0];if(Z){X=Z}}}return X}function A(){return !a&&F("6.0.65")&&(||M.mac)&&!(M.wk&&M.wk<312)}function P(aa,ab,X,Z){a=true;E=Z||null;B={success:false,id:X};var ae=c(X);if(ae){if(ae.nodeName=="OBJECT"){l=g(ae);Q=null}else{l=ae;Q=X};if(typeof aa.width==D||(!/%$/.test(aa.width)&&parseInt(aa.width,10)<310)){aa.width="310"}if(typeof aa.height==D||(!/%$/.test(aa.height)&&parseInt(aa.height,10)<137)){aa.height="137"}j.title=j.title.slice(0,47)+" - Flash Player Installation";var"ActiveX":"PlugIn",ac="MMredirectURL="+O.location.toString().replace(/&/g,"%26")+"&MMplayerType="+ad+"&MMdoctitle="+j.title;if(typeof ab.flashvars!=D){ab.flashvars+="&"+ac}else{ab.flashvars=ac}if(!=4){var Y=C("div");X+="SWFObjectNew";Y.setAttribute("id",X);ae.parentNode.insertBefore(Y,ae);"none";(function(){if(ae.readyState==4){ae.parentNode.removeChild(ae)}else{setTimeout(arguments.callee,10)}})()}u(aa,ab,X)}}function p(Y){if(!=4){var X=C("div");Y.parentNode.insertBefore(X,Y);X.parentNode.replaceChild(g(Y),X);"none";(function(){if(Y.readyState==4){Y.parentNode.removeChild(Y)}else{setTimeout(arguments.callee,10)}})()}else{Y.parentNode.replaceChild(g(Y),Y)}}function g(ab){var aa=C("div");if({aa.innerHTML=ab.innerHTML}else{var Y=ab.getElementsByTagName(r)[0];if(Y){var ad=Y.childNodes;if(ad){var X=ad.length;for(var Z=0;Z<X;Z++){if(!(ad[Z].nodeType==1&&ad[Z].nodeName=="PARAM")&&!(ad[Z].nodeType==8)){aa.appendChild(ad[Z].cloneNode(true))}}}}}return aa}function u(ai,ag,Y){var X,aa=c(Y);if(M.wk&&M.wk<312){return X}if(aa){if(typeof{}if({var ah="";for(var ae in ai){if(ai[ae]!=Object.prototype[ae]){if(ae.toLowerCase()=="data"){[ae]}else{if(ae.toLowerCase()=="styleclass"){ah+=' class="'+ai[ae]+'"'}else{if(ae.toLowerCase()!="classid"){ah+=" "+ae+'="'+ai[ae]+'"'}}}}}var af="";for(var ad in ag){if(ag[ad]!=Object.prototype[ad]){af+='<param name="'+ad+'" value="'+ag[ad]+'" />'}}aa.outerHTML='<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"'+ah+">"+af+"</object>";N[N.length];X=c(}else{var Z=C(r);Z.setAttribute("type",q);for(var ac in ai){if(ai[ac]!=Object.prototype[ac]){if(ac.toLowerCase()=="styleclass"){Z.setAttribute("class",ai[ac])}else{if(ac.toLowerCase()!="classid"){Z.setAttribute(ac,ai[ac])}}}}for(var ab in ag){if(ag[ab]!=Object.prototype[ab]&&ab.toLowerCase()!="movie"){e(Z,ab,ag[ab])}}aa.parentNode.replaceChild(Z,aa);X=Z}}return X}function e(Z,X,Y){var aa=C("param");aa.setAttribute("name",X);aa.setAttribute("value",Y);Z.appendChild(aa)}function y(Y){var X=c(Y);if(X&&X.nodeName=="OBJECT"){if({"none";(function(){if(X.readyState==4){b(Y)}else{setTimeout(arguments.callee,10)}})()}else{X.parentNode.removeChild(X)}}}function b(Z){var Y=c(Z);if(Y){for(var X in Y){if(typeof Y[X]=="function"){Y[X]=null}}Y.parentNode.removeChild(Y)}}function c(Z){var X=null;try{X=j.getElementById(Z)}catch(Y){}return X}function C(X){return j.createElement(X)}function i(Z,X,Y){Z.attachEvent(X,Y);I[I.length]=[Z,X,Y]}function F(Z){var Y=M.pv,X=Z.split(".");X[0]=parseInt(X[0],10);X[1]=parseInt(X[1],10)||0;X[2]=parseInt(X[2],10)||0;return(Y[0]>X[0]||(Y[0]==X[0]&&Y[1]>X[1])||(Y[0]==X[0]&&Y[1]==X[1]&&Y[2]>=X[2]))?true:false}function v(ac,Y,ad,ab){if({return}var aa=j.getElementsByTagName("head")[0];if(!aa){return}var X=(ad&&typeof ad=="string")?ad:"screen";if(ab){n=null;G=null}if(!n||G!=X){var Z=C("style");Z.setAttribute("type","text/css");Z.setAttribute("media",X);n=aa.appendChild(Z);if( j.styleSheets!=D&&j.styleSheets.length>0){n=j.styleSheets[j.styleSheets.length-1]}G=X}if({if(n&&typeof n.addRule==r){n.addRule(ac,Y)}}else{if(n&&typeof j.createTextNode!=D){n.appendChild(j.createTextNode(ac+" {"+Y+"}"))}}}function w(Z,X){if(!m){return}var Y=X?"visible":"hidden";if(J&&c(Z)){c(Z).style.visibility=Y}else{v("#"+Z,"visibility:"+Y)}}function L(Y){var Z=/[\\\"<>\.;]/;var X=Z.exec(Y)!=null;return X&&typeof encodeURIComponent!=D?encodeURIComponent(Y):Y}var d=function(){if({window.attachEvent("onunload",function(){var ac=I.length;for(var ab=0;ab<ac;ab++){I[ab][0].detachEvent(I[ab][1],I[ab][2])}var Z=N.length;for(var aa=0;aa<Z;aa++){y(N[aa])}for(var Y in M){M[Y]=null}M=null;for(var X in swfobject){swfobject[X]=null}swfobject=null})}}();return{registerObject:function(ab,X,aa,Z){if(M.w3&&ab&&X){var Y={};;Y.swfVersion=X;Y.expressInstall=aa;Y.callbackFn=Z;o[o.length]=Y;w(ab,false)}else{if(Z){Z({success:false,id:ab})}}},getObjectById:function(X){if(M.w3){return z(X)}},embedSWF:function(ab,ah,ae,ag,Y,aa,Z,ad,af,ac){var X={success:false,id:ah};if(M.w3&&!(M.wk&&M.wk<312)&&ab&&ah&&ae&&ag&&Y){w(ah,false);K(function(){ae+="";ag+="";var aj={};if(af&&typeof af===r){for(var al in af){aj[al]=af[al]}};aj.width=ae;aj.height=ag;var am={};if(ad&&typeof ad===r){for(var ak in ad){am[ak]=ad[ak]}}if(Z&&typeof Z===r){for(var ai in Z){if(typeof am.flashvars!=D){am.flashvars+="&"+ai+"="+Z[ai]}else{am.flashvars=ai+"="+Z[ai]}}}if(F(Y)){var an=u(aj,am,ah);if({w(ah,true)}X.success=true;X.ref=an}else{if(aa&&A()){;P(aj,am,ah,ac);return}else{w(ah,true)}}if(ac){ac(X)}})}else{if(ac){ac(X)}}},switchOffAutoHideShow:function(){m=false},ua:M,getFlashPlayerVersion:function(){return{major:M.pv[0],minor:M.pv[1],release:M.pv[2]}},hasFlashPlayerVersion:F,createSWF:function(Z,Y,X){if(M.w3){return u(Z,Y,X)}else{return undefined}},showExpressInstall:function(Z,aa,X,Y){if(M.w3&&A()){P(Z,aa,X,Y)}},removeSWF:function(X){if(M.w3){y(X)}},createCSS:function(aa,Z,Y,X){if(M.w3){v(aa,Z,Y,X)}},addDomLoadEvent:K,addLoadEvent:s,getQueryParamValue:function(aa){var||j.location.hash;if(Z){if(/\?/.test(Z)){Z=Z.split("?")[1]}if(aa==null){return L(Z)}var Y=Z.split("&");for(var X=0;X<Y.length;X++){if(Y[X].substring(0,Y[X].indexOf("="))==aa){return L(Y[X].substring((Y[X].indexOf("=")+1)))}}}return""},expressInstallCallback:function(){if(a){var X=c(R);if(X&&l){X.parentNode.replaceChild(l,X);if(Q){w(Q,true);if({"block"}}if(E){E(B)}}a=false}}}}();
Every revision of a tiddler is preserved and when more than one revision exists, the author/date line includes a (n prior versions) portion. Clicking on it brings in the list of previous versions, and you can view each one.
|color:red;background:#d8e7e6;, to be precise. <br> will show the same but has [[some limitations|App Engine on Google Apps]] that I'd much like if Google could eventually remove.|
!!What it is
* An efford to demo, document & promote the [[software|giewiki is free]] by example.
* A wiki! (or at least a blog...)
!!What it is //not//
This site is not intended to permanently host unrelated content of all kinds, like a [[TiddlyWiki hoster]] - but I  could easily be persuaded to let potential users have their private subdomains of for a trial period, until they find out if it fits their needs (use the ''message'' button below [which only shows when you are logged in] if you are interested). The reason for this reluctance is the fact that giewiki, unlike some TiddlyWiki hosters, is designed to easily support file upload and a degree of scale-ability that the hosting sites do not offer.
<<image > 42%>>
I awoke today and found the frost perched on the town
It hovered in a frozen sky, then it gobbled summer down
When the sun turns traitor cold 
And all the trees are shivering in a naked row
I get the urge for going but I never seem to go

I get the urge for going
When the meadow grass is turning brown
Summertime is falling down and winter is closing in

I had me a man in summertime
With summer-colored skin
And not another girl in town
My darling's heart could win
But when the leaves fell trembling down, and
Bully winds did rub their faces in the snow 
He got the urge for going 
And I had to let him go

He got the urge for going
When the meadow grass was turning brown
Summertime was falling down and winter was closing in

Now the warriors of winter they gave a cold triumphant shout
And all that stays is dying, all that lives is getting out
See the geese in chevron flight flapping and a-racing on before the snow
They've got the urge for going, and they've got the wings to go

They get the urge for going
When the meadow grass is turning brown
Summertime is falling down and winter is closing in

I'll ply the fire with kindling now, I'll pull the blankets up to my chin
I'll lock the vagrant winter out and bolt my wandering in
I'd like to call back summertime and have her stay for just another month or so
But she's got the urge for going and I guess she'll have to go

She gets the urge for going when the meadow grass is turning brown
All her empire's falling down
And Winter's closing in

<<iFrame 315>>
This was, and still is, my only contribution to YouTube. A lesson in the practical tactics of mother swans.
<<youtube uac69z5ypKI -1280,59% altlabel "A swan with seven young ones, five of them on her back">>
<<image '/RebelWithoutACause.jpg' < 50%>>
<<image '/IMG_3827.JPG' < 50%>>
It certainly came after that phenomenon known as phasebook (an f-word). Who knows if it will replace it.
Sing Helplessly Hoping very nicely.
<html><iframe width="560" height="315" src="" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe></html>

How about, when editing a tiddler, being able to indicate that you don't want to edit the first M and the N lines.

How about predefined default tags/attributes...
Tagging a tiddler in a specific way should be taken to imply that it is be removed (or hidden) after a certain date. This is one of potentially many rules that could be applied using tags. I must make a pattern for indicating that a tag should not be listed in the usual way (if at all).
<<youtube b9F8Wn4vf5Y>>
[[Release 1.18: improved file upload]]
[[Release 1.17: Full-text site search]]
[[Release 1.16: Custom tiddler templates made easy]]
[[Release 1.15: Scaleability]]
[[giewiki is free]]
This is giewiki. It's free as in as in freedom of expression and sharing ''//and//'' as in free of cost or commercial entanglement. It borrows heavily from TiddlyWiki, but takes the viewpoint that //TW// is a great way of organising information, if only it weren't (//probably//) stored on a USB stick in the pocket of the pants that you wore yesterday. If, like me, you are mostly always online, online is where you would want to store it.

//"- OK, but ''what does it do''"//, I hear you asking.

Well, it's a general purpose software tool for //capturing//, //organizing// and //sharing// (mostly) unstructured information, with an equal priority to all three activities. If you like to put everything in boxes with labels on them, you might call it a [[CMS]]. It can serve equally well for personal use as for collaborative projects, forums, etc.

It also tries to give equal priority to 
* ''ease of use'' for those who just want to apply it to specific problem that does not require customization, //and// 
* ultimate ''power and flexiblilty'' to those who are prepared to invest a bit of time into finding out how it can be twisted and honed into a tool, that can replace some of the commercial products they might otherwise use. The more time you can invest, the bigger the reward you may see. What it //will not do// however is try to shield users from the problems that may arise from trying to twist it to meet a specific requirement. To do that would (regrettably) require an investment of effort that is currently beyond what I can spend while giving priority to these two goals. Such is the nature of software and the web browser document object model in particular.

<<image 'kanalen-i-oktober.JPG' > 40%>>I strive to include all the features that users may need to accomplish a wide variety of application. Images can, for instance, be uploaded and integrated into the text using a simple syntax, like in 
<<image kanalen-i-oktober.JPG > 40%>>
which has the effect of embedding the specified image on the right, filling 40% of the story column width as shown here. This is an example of the use of a //macro//, of which there is a variety in giewiki, designed to complement what you can do with plain text and a set of simple markup rules.

Visitors can add or view comments using the menu below, or add messages to the author.

Zoologically, it's a somewhat distant descendant of the WikiWiki concept that Ward Cunningham introduced some sixteen years ago. It's a direct descendant of TiddlyWiki version 2.4.1.

The ultimate aim of giewiki (dare I write claim ?) is to offer the most powerful solution for general purpose web publishing, that is available to non-technical users entirely for free. Obviously, it won't run on wind power alone - you need some sort of digital hardware. I also recommend that you use the free hosting offered by Google in the form of their App Engine, which is free as long as your needs are modest and you don't require your own domain (you would have a subdomain of, like If your needs (traffic, storage or other) exceeds certain limits, you can still use App Engine, at cost. And you //can// have it serve though your own domain, at cost and with some [[limitations|App Engine on Google Apps]]. For more information, check out - ''Linux server owners'' may want to try out [[AppScale|]] as an alternative; I haven't yet had the time.

Obviously, this isn't going to be the best solution for every application, but the aim is to offer the best solution for as many as possible.
In order for giewiki to scale better in terms of handling large documents, it should support just-in-time loading of tiddlers. This in itself would be easy, but of course the search feature would then have to include a server call.
Release 1.15.8 of giewki fills in a missing piece by letting you set fields through a dialog that can be brought up with the "fields://TiddlerName//" link syntax. The reason for this activation path is so that you can access it even if it isn't accessible via the normal view template. Which comes in handy because the primary reason for doing this dialog in the first place is so that you can pick which template to use, not necessarily one that offers the //fields// menu command through which you normally have access to it. I had actually created a way by which you could display the dialog through a new tab in the index. It did solve the problem of click-your-way access to the dialog even for tiddlers that do not have the standard viewtemplate and thus no access to the fields command. But didn't seem to be a terribly elegant solution, so I removed it for now, which means that to access the fields editing dialog of a tiddler that doesn't have the //fields// menu command (in any accessible template), you need to know that (temporarily) creating a link to {{{fields/TiddlerName}}} is the solution. I don't think this is a big problem, but let me know if you prefer to find it via an index tab.

<<youtube un5UKqwTLHg>>
Personal settings:
* Option to save current view state
* Option to filter out parts
* Option to start from a sub-branch
With release 1.15, the caption in the tiddler tags box now has an added feature: when clicked, it retrieves a list of all tiddlers //site-wide// that have the same tags as those listed. For each of these, a * is a added to the matching tag in the list, and now, when you click the tag, the drop-down list shows all tiddlers, including the full path to those that are not local.
Simon Baird, the author of the MPTW template, seems to prefer presenting dates relative to the present (rather than absolute). There is obviously some merit in that idea, but I wonder if it shouldn't be an option in the AdvancedOptions.
Users should be able to specify that they want to use a different page template than that chosen by the page owner.
[at their own risk and if so allowed by the owner (security issue)]
<html><iframe width="560" height="315" src="" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe></html>
A user suggested I look into the possiblilities for integrating with Wordpress:
> The wordpress blogging software allows python to edit & read it via xml-rpc, which means one can use the cron function in google app engine to synchronize a selected subset of giewiki  tiddlers with wordpress.  
> Here is a link to a python wrapper for xml-rpc, , here is another 
I must confess my time is limited and as I'm not a WordPress user myself, it isn't at the top of my todo list. ''//But//'' why not throw it up in the air with the possiblilty of some developer being in a position to run with it.
That's me. I'm guilty of designing the the server-side and some of the browser script that you are using just now. You can reach me at Sorry, that's I am a Copenhagen-based consultant/developer with a lot of experience (if not skills) in mostly windows-based software development.
By Derek Muller
I should gather the links to the most important threads related to gw at [[|]]. [[The search|]] isn't as useful as could be.

And at the same time promote the pattern of using gw to develop your posts (new threads) before posting, cuz:
* Once your post is out, you cannot edit it.
* The quality of the initial posts is important on many levels.
* You'll have time to consider if it is really appropriate after all -perhaps you find the solution yourself.
<script label="Python">
	var re = document.getElementById(formName() + 'output');
</script> <script label="Javascript">
	var re = document.getElementById(formName() + 'output');
	var exp = GetForm(place).expression;
	var text = eval(exp);
	if (typeof(text) == 'object') if (text.output) text=text.output;
	re.appendChild(document.createTextNode(text)); createTiddlyElement(re,'br')
|>|<<localDiv output>>|
|>|>|Evaluate<br><<input textarea expression 20*70>>|
<div class='viewer' macro='view text wikified'></div>
<html><iframe width="560" height="315" src="" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe></html>
<<iFrame 1500>>
3 fine Joni songs performed by Aoife O'Donovan & Chris Thile.
<html><iframe width="560" height="315" src="" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe></html>
<<image > 60%>> I just had to share this one.
I'm wondering', 
* should the RecentChanges have a tags column?
* would't it be nice if you could sort it (or the N most recent) by URL, author, etc?
* how about including / merging the RC's of your personal projects/subdomains.
|color:red;background:#d8e7e6;//A brief guide to setting up ''giewiki'' either for local use ''-or-'' hosted by Google at your own '''' (sub-)site.<br>Bauwe Bijl has gratiously made this [[video tutorial|]] on the latter subject, specifically for the case of using a Linux client. Windows and Mac users have a GUI alternative when it comes to launching the appcfg script for the upload process.<br>[[This post|]] adresses a problem with index creation that has previously been seen if you deploy giewiki using the (default) high-replication data store, which is why Bauwe says to use the master-slave datastore. On my latest attempt, the problem seemed to have been fixed. If your level of trafic exceeds the free limit, you will still find the master-slave datastore to be cheaper (I believe), but unfortunately you cannot switch once an app has been created.//|

! Software Requirements
Download the [[latest release|Download (Source code)]] and unpack it (''or'' you can pull the most recent bits directly from Subversion, if you have software to do so).
Either way, you will also need [[Python 2.5|]] (2.6 or 2.7 seem to work as well) and the [[App Engine SDK |]] from Google, both of which are also free (recent Mac and most Linux boxes already have Python; if your're unsure, open a terminal window and type python [enter]).
! Running giewiki locally
The App Engine SDK includes a simple web server together with the runtime libraries required to run a server on your own computer. Both the Windows and the Mac version also includes a graphical frontend called the ''Google App Engine Launcher'' for starting this web server. Simply fire it up and go to File - Add existing application. Point it to the folder containing the unpacked giewiki files. That will give you an entry in the list that it presents. Select this entry if it isn't already and click the ''Run'' button above. After a little while (during which Windows may prompt for your confirmation), the server should be ready and the ''Browse'' button gets enabled. Clicking that will fire up your default web browser with the address of your local server. If you are on Linux (or you want the server to start automatically), there is an alternative (command line) method which is described at
Some command line options to the server that are nice to know if you need them (you have to specify them 'manually' in the [Edit - Application settings] //Extra command line Flags// of the App Engine Launcher):<<tiddler "dev_appserver options">>
! hosting requirements
Unless you are setting it up on behalf of someone else, you will need to have your own (free) App Engine account. Go to if you haven't one already - the process requires a phone capable of receiving text messages for the purpose of identification.
! Adaptation for hosting
To deploy giewiki to your own '''' site (//this is not neccessary to use it locally//), you have to first change one file, the one named ''app.yaml'' (a plaintext file that you can edit with notepad (on a Mac, use textedit), altering the first line: 
application: giewiki
}}} name your appspot subdomain in stead of {{{giewiki}}}.
! Deployment to
Actual deployment can be performed using the '''' script as described [[here|]]

What that page doesn't say, however, is that on some platforms (Windows and Mac), you can launch the process directly from the above mentioned ''Google App Engine Launcher'' (a GUI application that comes with the App Engine SDK). Just choose ''File-Add Existing application'' and select the unpacked giewiki folder, that you have modified as described above. Then it will be added to the (initially empty) list, and you can just select it and click the ''deploy'' button. The deployment process takes a couple of minutes, but there's an output window that shows you what's happening.

If this is ''not'' the first version that you deploy to a particular site, you need to explicitly set the new version as the default, using the app engine dashboard at (under Administration/Versions) - this is so that you can revert to the prior version, if needed.

There is currently no way to deploy content together with the code, but if you need to, read

Beware that if you are upgrading an existing application, in some cases it may be a while before it is fully functional, because the server needs to rebuild the indexes which is a task that is queued for batch processing. Under heavy load it may take several hours, but you can monitor the process at
!Upgrading to a new version
Beware that if you have an earlier version installed in your account already, you need to visit ( will take you there) in order to make the new version the active one. This is done via the versions list. The 1.x releases appears as version x (unless you have changed it in the app.yaml).  If you already have (about) 10 versions deployed, you may have to delete some before you can deploy a new version. 
<<image < 50%>>This version introduces full-text search using the new search feature of App Engine 1.7, which is only supported when using the High-replication data store ([[migration of master-slave datastore apps|]]). The feature is integrated with the Page search dialog, which is now a fold-out element of the toolbox on the right. Pre-existing datastores can be indexed for search via the AdvancedSearch dialog (in the SDK it must be done on each server start, and the SDK implementation is lacking in other respects as well compared to the production environment). If you are using paid service (or close to the limit of free service, beware that the indexes needed by full-text search will consume additional storage. Only the current versions of a tiddler is searchable, though.

Tiddlers are indexed only if they are public, ie. on a page that offers at least read access to anonymous users. All user-defined attributes of a tiddler are searchable, either across the entire site or (when folders are used) within a area. An AdvancedSearch dialog allows searches to match specific attributes only.
* Additions to the PageProperties dialog are now possible, allowing custom fields to be defined on the page object. These are available as content using the new {{{<<page fieldname>>}}} macro.
* The '?highlight=text' syntax can be used to highlight a specific text, via URL's like {{{/Wonderland?highlight=Alice#%5B%5BFind%20Me%5D%5D}}} and using pretty-links like {{{[[Find Alice|Find Me?highlight=Alice]]}}}.
!Release 1.17.1
This release includes the minor changes needed to support recent changes to the search API of Google App Engine. It also adds a new macro called smugFeed. This allows users of the SmugMug photo hosting service to present a random image or a sequence of images, as defined by either of the RSS feeds that SmugMug makes available. The syntax is
{{{<<smugFeed rssurl width interval>>}}}
where //width// and //interval// are optional:
* ''width'' defaults to 100% (of the containing column width)
* ''interval'' is taken to be a number of seconds; if provided, the image is replaced with another random image from the same feed at the specified interval.
The available feeds on your smugmug site are found at the bottom of each page.
<<youtube MnCf9Gjz720 400,62.5%>>
<<youtube FdfXHWUKm-8 -600,60% altlabel "Loudon Wainwright III performing his Swimming Song" >>
I first heard the song on [[this album|]]. Thanks Kate.
was released today.

I'm editing this on my new 4th gen iPod touch. It works quite when using a wireless keyboard. Less well with the on-screen keyboard, because it takes too much screen space.

Anyway, the most important new features of version 1.5 are:
* Ability to revert edit's, deleting the last edit or preserving it while making an earlier version the current version. You can also delete prior versions, if you prefer.
* Page properties now has a Library section where you can choose from 3 different sources for tiddlers to import:
# static: a list of xml files that have been installed.
# local: anything within the site that lives in a folder that ends with //lib// or that has a name ending in //Library//.
# giewiki (the [[/lib/plugins/|/lib/plugins/]] page on this site)

In addition you can now, by tagging a tiddler ''systemScript'' in stead of (or in addtion to) ''systemConfig'', have the content loaded as a "normal" script, that is via a {{{<script src='...'>>}}} element. This helps debugging greatly, especially with Chrome.
//Yes, wouldn't you like to know how to escape Christmas?//
<<image < 50%>>Well, try hitting him gently over the head with the escape key (don't worry, he's got the hat for protection) &mdash; then run as fast as you can.
I haven't really done much of a survey of professional ''C''ontent ''M''anagement ''S''ystems, but I would certainly be interested in the opinion of those who have. Particularly of course if they take the time to thouroughly evaluate giewiki in that light.
|private|private|Only the author sees it|NYI|
|reserved|private|Together with private, preventing others from creating tiddlers of the same name|NYI|
|revise_after|private|Together with a date bring attention of the author to it's potential redundancy|NYI|
|remove_after|private|Together with a date cause the tiddler to be removed automatically on a given date|NYI|
People may want to have personal content, like calendars, search or edit tools, etc. overlaid over every page they visit. 
If the files are jpg images, a tiddler will be made that has a {{{<<image filename 50%>>}}} [[macro|ImageMacro]]. For other file types, you just get a link to to the uploaded file. All uploaded files are also listed in the [[File list]]. 

An exception is the ''.twd'' file type which is expected to be a TiddlyWikiDocument. The server will read such files, and if they include tiddlers, those tiddlers will be imported into the current page.
* You will often be warned that you are leaving the page even though you aren't.
* It doesn't warn you that your login has expired when editing.
<<image < 50%>><<tiddler "Cheech & Chong PR">>
<<image 'StayClose.jpg' < 50%>>In mum's footsteps
.siteTitle {font-size:3.75em;}
Giewiki should support adding tags to a tiddler without going into edit mode and necessarily creating a new version - done. There should be a separate permission level governing this (above 'comment') - todo.
The isPrivate [attribute] tag (which can be applied //only by the owner of a page//) has the effect of not including the tiddler when serving the page to anyone other than the owner.
''However, the tag is not intended for //sensitive// private content, as other users will still get it when there is a link (wikilink or other) that causes it to be retrieved just-in-time'' and it doesn't prevent it from being included in the RecentChanges. I should probably add an alternative that doesn't have these gotchas.
The task of building, ordering and managing lists is one of the most common (and often important) problems for many people. When the lists are lists of tiddler (and there is often no need why they shouldn't be), what does the requirement spec look like and who has the best ideas, solutions, etc. Definitely a subject for a wiki page.
In hindsight, I admit, it may not seem like all the new features of this release have to do with scaleablility. And there have been a few bugs that I wish I could have squashed before 1.15.0. A few more will likely follow before I can embark on longer projects &mdash; anyway, what's new?..:
* [[Site-wide tag links]], retrieved via the 'tags' caption.
* User-defined template for the [[auto-generated mails]].
* New option to [[Auto-save changes while editing]].
* Allows a [[custom revision history]] to be defined via the ViewTemplate.
* [[On-demand-loading macros]] assuming tiddler title = '<macro-name> macro'.
* [[Lazy-load|When to fetch linked content]] tiddler attribute for generel load-on-demand.
* [[The "requires" attribute|RequiresAttribute]] for systemConfig tiddlers.
* Admin now has direct DataStore link to
* User's sub-sites are now listed in the site-map (but still do not expand).
!!Release 1.15.9:
Tiddler field editing is improved, particularly in relation to "viewtemplate" and "edittemplate".
!!Release 1.15.8:
* Tiddler fields can now be added, edited & deleted (by clearing the value) via a dialog available to admins through the 'fields' popup. This allows selecting an alternative "viewtemplate" and/or "edittemplate" for a tiddler, or defining the "requires" attribute of a systemConfig tiddler, etc.
* When Moving a page to a different URL, you now have the option to set up a redirect of the current URL to the new.
* Whether to show the tiddler byline in read-only mode is now a page property.
!!Release 1.15.6
Adds the ability to move a page to a different address. 1.15.7 improves on it by letting you set up a redirect of the old address.
!!Release 1.15.5
...fixes broken TiddlyWiki export and the <title> element of the HTML <head> which wasn't being filled in. Still presented as 1.15.4 on the GAE admin page (I forgot to update App.yaml).
It's therefore listed in stead of the defined ~DefaultTiddlers in such case.
!!Release 1.15.4
...fixes the CreateNewPage dialog, when used from missing tiddlers.
Also fixes issues in PageProperties as understood by FireFox. 
!!Release 1.15.3 
...fixes the broken subdomain support in 1.15.2 and implements the ~NoAccessMessage. This is a special tiddler, which prompts the user to log in if he doesn't have (anonymous) read-access to the page. 
!!Earlier releases
[[Release 1.14.0: Useability]]
[[Release 1.13.1: Don't let the dust settle]]
[[Release 1.12.2]]
[[Release 1.12]]
[[Release 1.10.1]]
[[Version 1.8.0: Giewiki unplugged]]

//some indeed quite frequent albeit perhaps not entirely relevant in this particurlar context. I'll try to answer them nonetheless, where I can. // 
!Is it -
* ''Better than [[traditional word processing|MicrosoftWord]]?'' <br> For most use cases I can think of, yes. //When was the last time ''you'' wrote a letter, printed it out, envoloped it and physically mailed it..?//
* ''Mature enough to be trusted?'' <br> It' s getting there... but, as always, keeping backups (in the form of xml or TiddlyWiki files) could still be worth your while.
* ''Better than MediaWiki?'' <br> It's certainly different. And more mallable - directly or through user feedback.
* ''Preferable to TiddlyWiki even for offline use?''
## On the ''plus'' side, it certainly offers a lot more features 'out of the box'. 
## If you are keen on security, giewiki also has the advantage that it doesn't (normally) trust the browser script with full access to your local file system.
** But...
## The drawback is that compatibility with TiddlyWiki plug-ins (and some content) isn't 100%.
## Setting it up is a little harder, because you need to use the App Engine SDK.
* ''Suitable for community forums?'' <br> Absolutely (IMHO).
* ''Fit as a problem management tool?'' <br> That's high on my list of specific applications.
* ''A great all-round wiki engine?'' <br> That was the number one goal. Rather mid between 'pure' WikiWiki and conventional thinking.
* ''More than that?'' <br> I would say, yes.
* ''Easy to learn?'' <br> Long story, but the short answer is yes, that an ambition.
* ''Adictive?'' <br> Intriguing question; it definitly has potential.
* ''An alternative to Facebook?'' <br> For those who want to be in control, yes.
!Will it -
* ''Serve as a personal productivity tool?'' <br> That's a major goal of giewiki.
* ''Help me stay focused?'' <br> That, too.
* ''Help me lose weight?'' <br> Probably not; it hasn't helped me.
* ''Feed my goldfish?'' <br> No, but I believe there's an iPhone app that will.
* ''Wash my car?'' <br> No, but this is planned for the release after next.
* ''Improve my golf handicap?'' <br> That would be a derivative effect...Let's discuss it while I'm looking for the ball...
* ''Make me a better writer?'' <br> Well, it just might do that.
* ''Help me get my message across?'' <br> That's high on the list.
* ''Walk my dog?'' <br> No, that priviledge is entirely yours. You asked for it.
* ''Write songs?'' <br> The answer is blowing in the wind...sorry!
!Does it
* ''Support translation?'' <br> Currently not easy, but I have plans to improve the situation (but don't hold your breath).
* ''Work on the iPad'' <br> Sure does.
* ''Even on the iPhone?'' <br> Surprisingly well, considering that it wasn't designed to (kudos to Apple)
!Why -
* ''did you create giewiki?'' <br> For your benefit and mine - and for fun (sort of...)
* ''this terseness'' <br> That's my style
* ''do I write //giewiki// in all lowercase?'' <br> That's how I write it in the address bar. It turned out I like it that way.
!How -
* ''do I set it up?'' <br> See the DeploymentGuide
* ''does it work?'' <br> long story. In short, Google takes care of that. Cloud computing.
* ''does it store my content?'' <br> Google takes care of that as well. But I'm thinking of adding a multi-tier design.
* ''Does that mean that it's visible to the world?'' <br> Not unless you want it to be.
* ''Does it mean you get site-wide full-text search for free?'' <br> Paradoxically, no. But Google says they are working on it. I'll probably wait and see what they come up with.
* ''do I take it with me?'' <br> Right sidebar -> options - download TiddlyWiki (one page at a time).
* ''does it compare to MicrosoftWord?'' <br> Favourably, I'd say.
!What are
* ''Your plans for'' ?
##[[Not to let the dust settle|DontLetTheDustSettle]] in too many places.
##To document the software in a way that actually gets read before it's needed. 
##And to produce a use case that might indirectly serve to inspire as an example.
* ''The key selling points''
** It just works.
** You might even come to like it
* ''in a name?'' (//"- that which we call a rose, by any other name would smell as sweet."//) <br> The name was chosen for historical reasons. If you need to remember how it is spelled, think ''G''eneric ''I''nternet ''E''nvironment. Or something less fuzzy. The wiki part is also kinda generic. It's supposed to be a Hawaiian word for quick. And last, but not least: Uniqueness.
!Terms - lingo & conditions
* What is a ''//tiddler//'' anyway? <br>A small(-ish) amount of text, the building blocks of giewiki
* What is a wiki? <br>A web site that is editable directly in the browser, using a simplified markup. Most wikis allow anyone to edit, trusting people to produce meaningful content. Wikipedia is an excellent example.
* What may I use it for <br> Anything that doesn't cause me liability - legally or ethically. // But preferably something that shines a favorable light back on it.//
* WhoDeservesCredit
* Why do I write SomeWordsSmashedTogether. 
I should allow the following parameters to the siteMap macro:
|tags|Produce a siteMap w. specific tag(s) - actually you can just edit the SiteMap tiddler via page setup|
|root|include only as subtree|
|filter|By tags or a text search|
The upcoming release will support just-in-time loading of macro implementation code as follows:
When invokeMacro does not have the macro already available, it will now try to get it through a (lazy-loaded) systemConfig tiddler either by the same name as the macro (//convenient//) or as defined by config.macros[name].tiddler (//more predictable//).

In as much as the association is macro name == tiddler name, an enhancement to the systemTiddler feature is in order, that would load the (shared) systemTiddlers only on demand.
Probably the most important criticism that can be aimed at TiddlyWiki is that you have to trust the document with write access to your local file system. Which is probably fine only as long as you don't install [[PlugIns|PlugIn]] of untrustworthy origin. Or start to edit documents of untrustworty origin. In other words, some caution is due. Giewiki eliminates the risk by delegating storage responsibility to a server (that you need to install on your computer if you want to be able to work offline).
Release 1.10.1 is a bugfix release of 1.10 which has these new features:
* Recycle bin for tiddlers (a world's first?) 
* Page templates can now carry a set of predefined tags as a simple way to indicate a use pattern. 
* Tiddlers can be tagged [[isPrivate]] (by the page owner only), [[but NB...|isPrivate]]. 
* More user-friendly tidler tagging process; with a separate menu of the special system-defined tags (called attributes); I never could remember excludeSearch & excludeLists. 
* Further enhancements to the page setup dialog (history available while editing). 
Release 1.9 introduced a somewhat unfinished, tabbed dialog for editing both Page properties and other elements of the page design, as well as 2 new options for tiddler import: Files on client device and already uploaded files. 
<html><iframe width="560" height="315" src="" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe></html>
I really should start documenting this a little better. Or a lot better. If it rains. Some documentation is available via the help menu of the tiddler edit dialog.
For several reasons, including usability concerns (especially with small devices), it should be possible to specify the proprortion of the page width that the should be given to each sidebar. This should probably be a page property, although the reader should also have the option for changing it.
OK, so giewiki is now on facebook: Not that I'm a fan of Facebook at all, but at least now nobody else can grab it. Facebook's page creation wizard does seem to have bugs, btw: I was prompted for an 'About' text, but what I gave it was nowhere to be found when the wizard completed. Shocking.

Anyway I do have a feeling that people are a lot more likely to hit 'Like' on a Facebook page than to leave comments here, so maybe there is a point to it after all: visibility.
My first involvement with open source - nearly a decade back - was to help out in an early stage of Mike Krüger's [[SharpDevelop|]] project, which he has since handed over to others. I still use it - //thank you very much// - when Microsoft's pro tools are much too heavy guns and their free tools are too limited.

[[SharpDevelop turns 10|]]
[[Chris Nicholls on the D800 vs 5D mk III|]]
[[App Engine Search|]]
[[Build your own Turing Machine|]]
[[Latest giewiki refs in the TW group|tiddlywiki/search?q=giewiki&start=0&scoring=d&]]
[[My Dropbox photo share|]]
[[the case for driverless cars|]]
[[Scott Adams draws Dilbert|]]
[[The learning mind|]]
A good initiative:

Other TW adaptations:
You would be excused for thinking keyword-based linking between pages in giewiki was somewhat absent. Anyway, that's what I've been working on today. What I have so far is that the tagging macro has a button at the end of the list that lets you check for the same tag on all pages of the site. It will probably come live here any day.
It should be possible to get various lists of tiddlers from the entire site using an URL query. At least:
Filtered by:
* tag
* title
* author
* date (interval)
* other attributes?
* <<tiddler shadowTiddler>>
* <<tiddler ServerSideExtensibility>>
<<youtube 3Z85yJwexow>>
A new feature  compared with TW is the line below each tiddler, which allows you to:
* comment on it (for all to see)
* add a message for the author
* add your own private note
If there are any such, it will also show in this line.
Two popular free TiddlyWiki hosting sites deserve mention to those who have limited requirements:
It could be argued whether or not anon users should be able to apply a pen name by setting txtUserName:
* Problem: they could clash with existing users pen names.
* Advantage: more TiddlyWiki-like
Current situation: Not allowed
<img src='/TitleImage2.jpg' style='position:absolute; z-index:-1; top:0; height:60px; width:40000px'>
<img src='/TitleImage2.jpg' style='position:absolute; z-index:-1; top:0; height:60px; right:0;' >
<div id='headerArea'>
<span class='siteTitle' refresh='content' tiddler='SiteTitle'></span>&nbsp;
<span class='siteSubtitle' refresh='content' tiddler='SiteSubtitle'></span>
<span id='topRightCorner' refresh='content' tiddler='TopRightCorner'></span>
<div id='mainMenu' refresh='content' tiddler='MainMenu'></div>
<div id='sidebar'>
<div id='sidebarOptions' refresh='content' tiddler='SideBarOptions'></div>
<div id='sidebarTabs' refresh='macro' force='true' macro='slider chkSideBarTabs SideBarTabs "index »" "display lists of tiddlers"'></div>
<div id='displayArea'>
<div id='messageArea'></div>
<div id='tiddlerDisplay'></div>

<<youtube 5oTtylYR76o 600>>

Norah Jones & Neil Young do Down By The River
<<youtube RDEfIxWEID0 600>>
|''Description:''|Facilitates embedding youtube content with optional subtitles|
|''Date:''|Jan 22, 2011|
|''Author:''|PoulStaugaard (poul (dot) staugaard (at) gmail (dot) com)|
|''License:''|[[BSD open source license]]|
|''Browser:''|Chrome; Safari; Firefox; InternetExplorer 6.0|

This plug-in add a macro to facilitate embedding Youtube content in your page. While you can do so simply by including the youtube embedding code between {{{<html></html>}}} tags, the youtube macro makes it easier, prettier, and you get a number of extra features, notably the option to associate it with a separate tiddler that contains subtitles to be rendered below the viewer window.

In its simplest use, it needs just one parameter, being the youtube ID of the video (the youtube ID is the portion of the youtube URL between ''?v='' and the first ''&amp;'' (if you take it from the browser address bar)):

{{ytmx{[[<<youtube P_NpxTWbovE>>|Hallelujah]]}}}

This will create the viewer window to fill the current width of the text column. If the user has a big screen this may be a little too big, which is why you can specify as a second argument either a fixed width (in pixels) or a maximum width preceded by a - (the latter is recommended).

{{ytmx{[[<<youtube tKQSlH-LLTQ -600>>|Both Sides Now]]}}}

Either way, once the viewer is created, it stays the same size if the browser window is resized. The height of the viewer is by default set to 80% of the width, but you can change that, by also specifying the relative height as a percentage of th width (separared by a comma):

{{ytmx{[[<<youtube MnCf9Gjz720 -700,%60>>|Google Earth Engine]]}}}

!Adding subtitles
To add subtitles to a youtube video, you need to define a separate tiddler containing the subtitles in the form of a two-column table, where the first column specifies the time at which the text on the second column is to appear, like this example:
|10.596|''Me and my uncle''|
|12.516|came riding down|
|14.002|From Colorado|
|15.71|West Texas bound|
To specify that a tiddler contains text to be rendered as subtitles below a youtube video, you just have to add the keyword text followed by the name of the tiddler (in quotes if it contains spaces) in the arguments to the youtube macro:

{{ytmx{[[<<youtube Zp3lJg07u4w -500 text 'Me And My Uncle (ts)'>>|Me and My Uncle]]}}}

The macro also has a feature that helps you produce the timing table. To use it, specify the keyword time in stead of text:

{{ytmx{{{{<<youtube Zp3lJg07u4w -500 time 'Me And My Uncle (ts)'>>}}}}}}

This will do several things:
* It will open the text tiddler in edit mode.
* It will - in stead of expecting a table - split the text into lines and create an event handler for each line, so that when the line is clicked while the video is playing, it will record the time for use in building the table. The entire text is rendered in the same place as the subtitles would have been.
* When the video finishes or you click pause, it will update the open edit window, adding table markup and timing information for the lines that you have clicked. If the timing information is already present, it will just change that.

If you want more control over where the text/subtitles are presented, you can add a second instance of the youtube macro in the desired place, specifying the youtube id and the keyword text-location:

{{ytmx{{{{<<youtube Zp3lJg07u4w text-location>>}}}}}}

!Other options
|class //classname//|Assigns classname to the div that wraps the player (and the default subtitle location)|
|play|Causes the player to start playing as soon as it is ready|
|chromeless|Causes the player to be presented without the control/status portion that normally appears below|
|pause|When used inside a subtitles tiddler, causes the playing video to be paused|
|pause resume|Like pause, but inserts a button to allow playback to be resumed. A further parameter may be given to specify an alternative label for this button|
|altlabel "link-text"|Causes ''link-text'' to be displayed in stead of ''YouTube/video-id'' on devices that do not support flash. For the benefit of iOS users, a link to youtube is inserted, which will launch the video in the YouTube application.|

Release 1.10 will contain a new feature which may not seem like much, but still help promote a succesdful use pattern:

The page templating mechanism now lets you define a set of standard ('predefined') tags to help promote consensus & consistency in the use of tags as a powerful way to organise content.

I'm planning to add a few more [[Predefined special tags]].
<html><iframe width="560" height="315" src="" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe></html>
I came across Vietnamese photographer Mai Huong on Google+. Highly recommended:
It struck me that the server could record the requests for non-existing tiddlers and maintain a list of such, that's delivered as part of the page to avoid unnecessary requests.
Version 1.7.1 has just one 'new' feature, which isn't entirely new: Support for ''subdomain wikis''. The undocumented implementation that was there before has been replaced by an implementation that takes advantage of App Engine's support for namespaces.
Obviously, the support for this in the local (SDK-based) scenario is dependent upon you setting up aliases for the subdomains to same IP address as the root site.

Anyway, this namespace facility gives me enough confidence in the data segregation to let you create your own private subdomain wikis here at The way to do this is via the '''My projects''' box in the '''my profile''' settings (hidden behind your LoginName). Beware that the name of your subdomain should be entered with all-lowercase letters.

The intention of this offer is primarily to let you try and evaluate giewiki before installing your own separate giewiki site, but there is not yet any limit set on the amount of content you can add.
I get increasingly sure that among the top priorities - at least for my own giewiki use pattern - should be to add a personal view to the recent changes and the sitemap (now implemented), by which you would get a unified access path to your own content, whether it's located in the root domain or in a (private or public) subdomain.
A related idea would be to allow easily getting a diff between two versions of a tiddler that you may have in two different subdomains.
<<image 'TitleImage2.jpg' < 50%>>
* Support private tags
* Upload of TiddlyWiki documents (now in subversion)
* Subdomains
* Import of Plugins from external URL's
* Optional email to the author of a tiddler when a comment is added
* A pattern for subclassing tiddlers
* Adding the [[includes|includes tag]] tag should bring in a list of tiddlers to include.
* App Engine lets you create cron tasks, that could collect information from the internet, send emails, etc. <br>Must play around with this...Definitly!
* DelayLoad (JustInTime)
* Server-managed user settings
* MinorTodo's
* Server-side search by Title/tags/text (key words)
* Auto-save
As you may have noticed, version 1.3.1 is now available for download ([[|]]). Among the new features are:
* Plugin manager is now loaded on demand if a plugin fails to load.
* Plugins that add to config.shadowTiddlers are now supported, including YourSearchPlugin (although there is an issue with IE).
* Tiddlers (such as plugins) can be added dynamically from local files or the web by adding a {{{?include=filename|tiddler1||tiddler2}}} query string to the URL - if you don't specify any tiddlers, you will get all. To reference a file on the web include the {{{//}}} part, but omit the {{{http:}}} prefix. Files may include a single tiddler div or several, wrapped in giewiki or tiddlywiki format.
* Tiddlers as well as pages can me made read-only (locked).
* Optional edit locking.
* You can have "hidden" subdomains with only their own content or with content, that's mixed with that of the parent site. When it's ready you can merge the subdonain content into the main site (this causes me to think that the features should be described as ''projects''). This feature is still a bit rough around the edges.
* Backup/restore (currently limited by the 1MB limit on server requests & responses enforced by App Engine).

The bugs that were reported on 1.3-beta have been fixed.
<<youtube ysQl7SUEo4s -600,62%>>
<<youtube lD8lJ1TBAc0>>
[[TiddlyWiki|]] is the name of an extremely versatile browser script, that implements sort of a personal MicroWiki within the confines of the webbrowser. You can even save it to a local file on your computer ([[if you let it|TiddlyWiki security]]). Primary resources are:
* [[|]]
* [[|]]
* [[|]]
* [[|]]
I must admit localization support has not been a high priority in the development of giewiki, and I haven't observed the same diligence in keeping strings separate as the TiddlyWiki developers did. My idea is that localization should be done using a set of tools, that could:
# Produce a table of all the text strings in the source code that should be translated. It would distinguish translatable strings form internal use strings by a convention of using double (") quotes for the former and single quotes (') for the latter.
# Help the translators produce localized versions of this table (sometimes context information is needed).
# Compile a translated version of the source code, using the localized string table.
The tasks needed to enable this process will be to:
* Go through the source code systematically to implement  1.
* Write the utilities to do 2 + 3
If you are a developer, you may help with tasks 2 + 3. If not, I'm going to ask for your patience until the tasks are completed. You might consider starting by translating the help files - the ones titled along the pattern "Help...xml", as they would not be be fit to put through the same process.
Mary Black sings Joni Mitchell's Urge for Going better than I ever heard.
<<image 'RebelWithoutACause.jpg' < 50%>>
You can have giewiki present the pages using an alternative browser script/xsl combination by uploading the files using the 'upload file' entry in the edit menu. Make sure the .xsl file links to the script file that you want to use. With two such files having been uploaded, you can direct giewiki to use them in place of the usual ones by adding a ?xsl=filepath parameter to the URL. This feature is intended as a debugging aid; I have presently uploaded a pair which you can get with the URL
They just differ by having a 'debugger' statement inserted.

The concept could be generalized to allow defining alternate script used for specific pages, folders, current user (or /group, /class)
The page properties now includes two new options concerning how th page looks to someone who does not have edit privileges:
* Whether to show the //n prior versions// information in the by-line.
* Whether to show the view button (for displaying the markup codes).
Both of these options are now ''off'' by default, where previously they were just there.
Currently, there is a single index.xml file, that includes the 10 most recently changed tiddlers. There is no markup filtering done in creating this page (I probably should).
* A new feature in the tiddler edit dialog - called ''changes'' - lets you get a diff showing what you have changed so far, before committing your edit. This works well with another new feature, known to TW friends as ''minor edit'': ctrl+shift+return will let a page owner make changes without generating a new version, but rather modifying the current version. (The keyboard shortcut works only when an input box has focus.)
* ''//Adding// tags'' is now possible without going into edit mode, but via a lightweight dialog accessed through the footer toolbar. This will not produce a new version either - the current version is modified. In addition, there is a new access level, called ''tag'', between 'add' and 'comment', allowing visitors to both comment and tag your content, if you can't be bothered to do it yourself.
* The file list is much improved, with features to delete & update files.
* The ''options'' fold out panel has been improved - you now have both the permaview option and the giewiki alternative, //automatic// sync of the address bar.
* The ''new tiddler'' dialog no longer requires that you name the tiddler in order for it to work the same the next time. If you don't, but leave the title blank, the server will assign a name to it, given the timestamp of creation.
* A new option in PageProperties let you define the right sidebar index lists as a fold-out element, which can improve performance on pages that have many tiddlers.
* A new Special tiddler lets you define a bit of optional content to appear in the top right corner of the title area. It is therefore named TopRightCorner.<br>//It works only on pages where you haven't previously customized the PageTemplate special tiddler, because it relies on a change to that.//
<img src='/TitleImage2.jpg' style='position:absolute; z-index:-1; top:0; height:5em; width:40000px'>
<img src='/TitleImage2.jpg' style='position:absolute; z-index:-1; top:0; height:5em; right:0;' >
<div id='headerArea'>
<span class='siteTitle' refresh='content' tiddler='SiteTitle'></span>&nbsp;
<span class='siteSubtitle' refresh='content' tiddler='SiteSubtitle'></span>
<span id='topRightCorner' refresh='content' tiddler='TopRightCorner'></span>
<div id='leftSidebar'>
<div id='mainMenu' refresh='content' tiddler='MainMenu'></div>
<div id='wideArea'></div>
<div id='sidebar'>
<div id='sidebarOptions' refresh='content' tiddler='SideBarOptions'></div>
<div id='sidebarTabs' refresh='macro' force='true' macro='slider chkSideBarTabs SideBarTabs "index »" "display lists of tiddlers"'></div>
<div id='displayArea'>
<div id='messageArea'></div>
<div id='tiddlerDisplay'></div>
[[giewiki is free]]
[[site map|SiteMap]]
[[recent changes|RecentChanges]]
[[recent comments|RecentComments]]
[[about this site]]
[[get your own|Get your own giewiki]]
[[download giewiki|Download (Source code)]]
[[deployment guide|DeploymentGuide]]
[[faq|Frequently asked questions]]
[[plugin compatibility|PluginCompatibility]]
[[Tower of Song]]
[[URL de jour]]
[[Mai Huong]]
giewiki v. <<giewikiversion>>
This release fixes several issues that were introduced by the change in 1.12.2 that moved the page properties code into a plugin, which is just-in-time loaded together withe the PageProperties dialog. A good idea it may have been, but a too hasty release. I hadn't realized that loadPlugins() failed to avoid installing the same plugins twice when called again. Fatal recursion was the result, when a plugin hijacks existing methods.

Also fixes an severe issue with sync from offline (TiddlyWiki) copies, that was reported by Marcello (thanks).
!!Known issues
* File upload is broken.

!Release 1.12.2
* Tiddlers can now be cut/copied from one [[subdomain]] to another (or the top domain). In the case of a //cut// operation, the tiddler is actually copied, while on the source page, it is moved to the recycle bin. Prior versions are ''//not//'' copied or moved.
* The file upload facility now detects URL conflicts and prompts for whether to replace the file.
* Tiddler .xml files (added by admin) can now include systemConfig tiddlers (like ~PageProperties.xml does).
* RecentComments are  now wikified (w. an explanation that internal links on other pages do not work).
<<image AnotherGlass.JPG  > 96%>><br>
@@font-size:0.80em; I always wanted to get another glass of beer.<br>Now I have.<br>(No, I'm not left-handed. This just seemed like the best place to put a virtual glass of beer. If you are a happy user of giewiki, you may consider buying me a real one at [[Cafe Svejk|]], should you be in town one sunny day.)<hr><br>Giewiki ver. <<giewikiversion>>@@
<html><iframe width="560" height="315" src="" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe></html>
[[Google Chrome|]]
Python & Google App Engine (obviously)
[[PyDev|]] on Eclipse
.NET Reflector
VMWare Fusion and Player
Visual Studio 6 - 2010
Windiff (!)
People with whom I collaborate often prefer different tools - often Microsoft Office - which is one reason it could be relevant to offer import/export facilities in giewiki...
A major new release with a focus on extensibility, for example the [[shadowTiddler]] facility. For now, check the [[change log|]], or browse the [[source code|]].

Before using it, please note that there is a semi-intentional bug in the RecentChanges tiddler. Check for an easy solution, or read HowToAddHttpMethods for an explanation.
The {{{<<importTiddlers>>}}} macro is a lot of js code that probably isn't used much except through PageProperties.I have therefore, in release 1.15, moved it into PageProperties.xml so that it isn't loaded except when the page setup dialog is opened.
<<image < 100%>>
As for giewiki development, auto-save now seems to work pretty well, and I've pretty much finished implementing lazy-load. Should probably make the tag @lazyLoad, so it doesn't show in read-only mode.
<<youtube Zp3lJg07u4w -500 text 'Me And My Uncle (ts)'>>
Priority is of course a concept which most people work with every day. ''//But//'' is it something that can and should be codified into a feature of giewiki - possibly a plugin or a page template.
It should be possible to have a separate favicon for a subdomain so that you can more easily recognize where it's located, just by looking at the browser tabs.
!Press release
Hello, we're Cheech & Chong. We like grass. 
We also run a start-up called 
''Cheech & Chong Logistics Ltd.'' 
out of Pebble Beach, Rockall.
Today, we are proud to announce that we recently 
won a contract with ''Santa'' for the upcoming season. 
Apparently, the reindeer were ''too dear''.
We're not. We're just ''//two// deer''.
But as we're still learning,
''"Expect some delays!"''
!!Some motives behind giewiki
When you find two not directly related solutions/tools that each have huge potential and which complement each other well, it is perhaps worth considering if you should seize upon the the opportunity to investigate their potential for synergy in a form and context that you care about and are able do something about. //I really should try to reduce the [[lix|]] of that sentence.//

''giewiki'' is the current form of such an efford on my part. We probably all have limited space for [[sofware|Software I choose to use]] in our intellectual tool chest. An ambition of mine is for giewiki to become deserving of a space in yours. /% A lofty ambition indeed, given the range and quality of the competition %/ If you find that it has potential but isn't there yet, I hope you will be back to check on it at later.
!! Scale-ability & availability
The more I work with giewiki, the more convinced I get of the value of its advantage over TW in regards to scaleability and availability:
!!! Scale-ablility
When the amount of content exceeds what TW will handle gracefully, there should be various ways to deal with the problem. In particular, ways that do not appear as having barriers in their adoptation, and also do not compromise the searchability of the content. Another kind of scaleablility is it's support for adding facilities that are perhaps not often used (and therefore shouldn't burden every page load), yet are still always available when you need them.
!!! Availability
Being cloud-hosted, a giewiki page is ubiquitously and equally available to me whether I'm working directly on my PC, on a server or on a separate site. I do not need to consider whether it should reside on one or the other machine, and make sure it's backed up. Another issue is the potential for versioning conflicts, that plagues TiddlyWiki (IMHO). Giewiki's solution to this problem is to let you keep edit locks at the tiddler level, preventing yourself or anyone else from accidently overwriting edits.
* Allow non-techical users to do more, in a way that offers them a path towards better understanding of techniques and now they work (but beware that the free, open source nature allows me to somewhat downplay the ability to offer them direct support in the process).
* Address as many relevant needs as I can for the sake of applicability, albeit at the expense of a longer, but hopefully not steeper learning curve. The idea being that if you see it being applied to one purpose, you at least become aware of it. If you see it being applied to a different purpose, you get an idea of its potential in yet other.
* Display a degree of openness that allows people an easy and confident approach to finding out if it matches their needs and skills - or may evolve to do so. A dialog with current and potential users would certainly benefit the process of prioritization.
* Possibly attract fellow developers who might help out or contribute use case solutions of their own.
Version 1.4 adds the ablility to define the information, which is shown about you as an author in the by-line:
* Your pen name (no longer simply your login name).
* The line that is shown as a tooltip when the cursor hovers over your pen name.
* The tiddler or page to which your name links.
You can also define "projects", which are sub-sites addressed via a URL prefix, like This works with the hosted app engine without any problems; whereas with the app engine SDK, it dependes on how your operating system resolves host names.
replicate making it a more living document.
The PageProperties dialog, which is accessed as part of the ''page setup'' (normally via the ''edit'' menu on the right), gives the author/admin control over the visiblility of the page to 3 classes of users:
* anonymous users, i.e. anyone who //has not// logged in.
* authenticated users, i.e. anyone who //has// logged in with their google account.
* group members, that is anyone who has been included in one or more named user groups.

Defining such user groups is also done via the PageProperties dialog. The levels of access that you can assign to each of the 3 user classes are:
* ''none'': Users cannot retrieve the content of the page.
* ''view'': Users can only view the page.
* ''comment'': Users can comment on the page, but not edit or add to it.
* ''tag'': In addition to comments, users can share tags that they find to be useful for navigating the content.
* ''add'': Users can add content ("tiddlers"), but not edit content created by others. This is intended to be an option for authenticated users only.
* ''edit'': Users can create, edit or delete any content (the recent changes, revision history and the recycle bin let the page owner revert damage).

|color:red;background:#d8e7e6; This dialog isn't functional unless you have ownership of the page|

<<tiddler PageProperties>>
may address the limitations of the browser.
giewiki ver. <<giewikiversion>>
When you use the ''add message'' button in the tiddler footer menu, two things happen:
* the message is included in a list accessible via a 'N messages' link in the footer menu.
* It is sent to the author of the tiddler using a template which you can define via //right sidebar - login-name - my profile//. It uses 3 parameters: <tiddler_name>, <message_text> and <tiddler_url>
TiddlyWiki to the power of AppEngine
It should be possible to link to a comment from giewiki source text [to this end, you would need to use the system-generated key]. Perhaps a new macro would be the form, or a convention of postfixing the id to the tiddler name (as a subscript, perhaps).
It is not obvious when you look at the ViewTemplate in view mode, that it also defines the format of the version history. This information is actually hidden in a special field called historyview. To allow changing it, the ViewTemplate has its own EditTemplate, which allows you to change this field. This is accessed via [[page setup|PageSetup]] - All - ~ViewTemplate.

The format is a '|'-separated list of attribute specifiers of the form
-or, for dates-
where custom fields must be specified using the form
I'm thinking of adding a tips button as well. What would you want each to do (please comment)..?
When giewiki's wikitext renderer finds a use of a macro which isn't currently defined, it will ask the server for a tiddler named //macro-name macro//, substituting the undefined macro for //macro-name//. If such a tiddler exists, and it has the //treat as script// (a.k.a. systemConfig) attribute, it will be interpreted to see if it defines a macro by that name - and if so, that macro will be invoked. This might happen if the tiddler has the lazyLoad attribute, or it is defined in an XML file which is included in the the installation. Examples of such XML files are part of the giewiki core. 

Obviously, the next time it finds this macro to be used, it will already be defined.
<html><iframe width="560" height="315" src="" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe></html>
The most important new feature of giewiki 1.2.1 is an extension of the shadowTiddler concept. It allows you to tag any tiddler //shadowTiddler// and have it appear as a shadow tiddler not only on the page where it resides, but on any page with a URL that begins with the URL of the source page. This allows you to define the structure and styling of an entire site in one place.

You can also tag a tiddler sharedTiddler, which also causes it to appear on all pages below it in the URL hierarchy. The difference is that it will appear as a normal tiddler. ''In either case, you need to be on the page where the tiddler was defined in order to be permitted to edit it''. This restriction is due to the design decision that access rights are defined at the page level, but I should probably include a message to this effect.

''The technical overview goes as follows:''

When you save a tiddler with either the //shadowTiddler// or //sharedTiddler// tags, it is entered //by reference// into the ShadowTiddler table, together with it's path. When building a page, the ShadowTiddler table is scanned and all tiddlers in it that have a path starting with the path of the page being served, are also included.

//It has been reported that a situation can arise where a tiddler can be deleted from the Tiddler table, but not from the ShadowTiddler as it should be since that table only contains references to the rows in the Tiddler table. When subsequently serving a page that includes such a tiddler, an unhandled error occurs causing the page to be inaccessible. The immediate remedy to this problem is://

* If you are using the App Engine SDK, browse to the page /_ah/admin/datastore?kind=ShadowTiddler and look at the path and tiddler columns to try to identity the row that should have been deleted (the title is not included here, but if you have several, they may be on different pages). If you are in doubt which one is problem, try follow the Tiddler: id=xx link. The bad row will give you a runtime error of type **EntityNotFoundError**. That's the row that you need to delete: go back to /_ah/admin/datastore?kind=ShadowTiddler, check the row in the leftmost column and click delete.
* If you are on the google-hosted App Engine engine, you have to go to and select the ShadowTiddler table. 

I will be making the following changes to prevent the problem:
* Handle the runtime error
* Be sure to delete the dependant row(s) before deleting a tiddler
* Prevent deleting a tiddler except when on the page where is lives. 
New features in this release are:
* The edit tiddler dialog now has cut and copy - when used, you get a 'paste tiddler' command in the edit menu, letting you move or copy tiddlers between pages.
* The help button in the edit dialog now works, giving a drop-down list of help topics.
* Comments can now be edited or deleted by the author, the page owner, or an admin.
* Any notes you add, are listed in your 'my profile' settings.
The iframe hosting of the login dialog has been dropped in favour of a simpler solution that doesn't have the same problems.
As always, remember that with a hosted giewiki, you need to go to to activate the new version in stead of the previous one. Check the DeploymentGuide for more info.
<<image 'TwoDucks.jpg' > 50%>>
The new release includes:
*a facility to use external script libraries, specified via PageSetup. jQuery and Modernizr is included as standard.
*official support for the [[MPTW|]] extensions as a template.
*all xml files in the static folder are automatically available as templates.
*templates can be chosen already in the 'new page' dialog.
*improvements to template management UI.
Two issues that should be documented:
*If you want to add external javascript libraries of your own, you need to do 2 things:
*#Drop them in the library folder.
*#Add them to the file, which is a dictionary of logical names to filenames.
**If a plugin uses an external script, it should be documented by a line in the header like<br>''|Requires script:|jQuery''|<br>This allows giewiki to record the fact in ~PageTemplates that are built from it, and pages that use the template will thus include the script as well.
*The ~PageTemplates now references the original page by title, not by path. This is a simplyfying change, but it means that:
**You shouldn't have multiple templates with the same title.
**If you currently have templates that you want to update, you need to first go into datastore admin and edit the PageTemplate instance so that the //page// field refers to the title, not the path of the source page. I did not have time to develop an automatic migration aid for this (and the restriction of uniqueness wouldn't make it 100% correct, anyway).
As always, remember that with a hosted giewiki, you need to go to to activate the new version in stead of version 10. Check the DeploymentGuide for more info.
<<image 'Bluehills7.jpg' < 50%>>The image macro lets you easily insert an uploaded image next to the text, like so:
<<image 'Bluehills7.jpg' < 50%>>
The second argument can be either < or > for left or right alignment, and the 3rd argument says how wide it should be. You can go all the way to 100% if you prefer:
<<image 'Bluehills7.jpg' < 100%>>
<<image Icount7.jpg < 60% >> //- I get seven, Jazz. Didn't we have eight?
- Don't be silly. Can you even ''count'' to eight?
- Well, there's Bessie, Ben, Billie, Bird, Dizzy, Ella and Prez. Where's Charlie?
- Charlie ''is'' Bird, Silly.
- You've got me confused...//

Hopefully, //''you''// won't be after reading the giewiki documentation, although it is - and always will be - a work in progress.

Shot in Frederiksberg Garden, May 19, a.d. 2011. is a very nice photo hosting service, that I have  recently started to use. Highly recommended.
The special tiddler HttpMethods defines the list of server methods that may be called from the browser script. These methods all appear as methods on the global object ''http''. They are added to this object during startup by the method http._init(), using the special tiddler HttpMethods as input.
To add another method to the http object to to be called from javascript, you can simply add it to the HttpMethods tiddler. Or, if you are writing a plugin you could call http._addMethod('name-of-method') in your systemConfig code. To call your http method with parameters, enclose those parameters as properties on an object that you pass as the one and only parameter to your method, like so:

  http.helloWorld({name: 'Poul', title: 'King'}); 

As for the actual implementation of such methods...
Prompted by [[Leo's post on the TWGG|]] and the already existing facilities in giewiki, I decided to try implement this feature. It's currently an option that you have to swich on via the options panel, and the auto-save interval is hard-coded, but it does offer a hidden advantage in a multi-user setting: The first time the auto-save kicks in during an edit, you automatically get an edit lock on the tiddler you are editing. The auto-saved version does not become the current version for others to see until you click save. Should you close the page without clicking save or cancel, you will get a message informing you of the unsaved tiddlers the next time you retrieve the page. And of course, the version that //you// get, is the most-recently autosaved version.
|''Description:''|Facilitates embedding youtube content with optional subtitles|
|''Documentation:''|[[YouTubePlugin documentation]]|
|''Date:''|Jan 22, 2011|
|''Author:''|PoulStaugaard (poul (dot) staugaard (at) gmail (dot) com)|
|''License:''|[[BSD open source license]]|
|''Browser:''|Chrome; Safari; Firefox; InternetExplorer 6.0|

//{{{ = {
	textLocation: {},
	paused: {},
	handler: function (place, macroName, params, wikifier, paramString) {
		if (params.length == 0)
			throw("Missing required parameter: youtube video id");
		var vid = params.shift(); // parameter 1: youtube video id
		var t = place;
		while (t.tagName != 'td' && !t.className.startsWith('tiddler') && t.parentNode)
			t = t.parentNode;
		var cw = t.offsetWidth;
		var w = cw;
		var rh = 80;
		if (params.length > 0) { // parameter 2: width,relative-height%
			var a2 = params[0];
			if (a2 == 'text-location') {
				var tn = story.findContainingTiddler(place).getAttribute('tiddler');[vid] = createTiddlyElement(place,'span', tn + 'textViewer');
			} else {
				var dims = a2.split(',');
				var da = dims.shift();
				var na = parseInt(da);
				if (!isNaN(na)) {
					if (da.right(1) != '%') {
						w = na; da = dims.shift();
					if (da && da.right(1) == '%')
						rh = da.slice(0,da.length-1);
			if (w < 0) {
				w = 0 - w;
				if (w > cw)
					w = cw;
		var h = w * rh / 100;
		var playButton = false;
		var ats = {};
		var aus = {};
		var tstn = null;
		var plwdClass = 'youtubePlayer';
		var nochrome = false;
		var altLabel = "YouTube/" + vid;
		for (var opt = params.shift(); opt; opt = params.shift()) {
			if (opt == 'class') // Player wrapper div class
				plwdClass = params.shift();
			else if (opt == 'chromeless')
				nochrome = true;
			else if (opt == 'altlabel')
				altLabel = params.shift();
			else if (opt == 'pause') {
				var player = document.getElementById(vid);
				var when =[vid];
				var cpt = player && player.getCurrentTime();
				if (player == null)
					wikify("//Player " + vid + " will stop at this point//",place);
				else if (!when || cpt < when || cpt > when + 0.2 )
					player.pauseVideo();[vid] = player.getCurrentTime();
					if (params.length && params.shift() == "resume")
						createTiddlyButton(place, params.length ? params.shift() : "resume", null, function(ev) 
							var target = resolveTarget(ev || window.event);
							//[vid] = false;
			else if (opt == 'play' || opt  == 'time' || opt == 'text') { // options: auto-play / transcript
				aus[opt] = true;
				if (opt == 'time' || opt == 'text') {
					tstn = params.shift(); // transcript TiddlerName
					if (!tstn)
						return displayMessage("Missing parameter: TextTiddlerName");
				var vpid = null;
				var iv = window.setInterval(function() {
					try {
						if (tstn && !aus.textLocation),tstn,ats,[vid],vid);
						var player = document.getElementById(vid);
						if (!player)
							return window.clearInterval(iv); // stop working
						var ps = player.getPlayerState();
						//if (ps != { displayMessage("State " + ps); = ps; }
						switch (ps) {
							case -1: // unstarted
							case 5:[vid] = false;
								if (
								if (!aus.transcript && !aus.text) break;
							case 0: // ended
								if (aus.changes);
							case 1: // playing
								var t = player.getCurrentTime();
								for (at in ats) {
									fat = parseFloat(at);
									if (t > fat && t < fat + 0.1) {
										wikify(ats[at],aus.textLocation); //-or-: aus.textLocation.innerHTML = ats[at];
							case 2: // paused
								if (aus.changes);
							case 3: // buffering
							//case 5: // cued
						} catch (x) {
			else if (opt == 'label' && macroName == 'youtube')
				playButton = params.shift();
		if (playButton)
			return createTiddlyButton(place, playButton, null,, "linkbutton", null, null, { args: paramString });

		var pen = 'pd'+vid;
		var wd = createTiddlyElement(place,"div",pen,plwdClass,null);
		if (!swfobject.getFlashPlayerVersion().major)
			wd.innerHTML = '<a href="' + vid + '">' + altLabel + '</a>';
		else {
			var pUrl = nochrome ? '' + vid + '&version=3&enablejsapi=1&playerapiid=ytplayer'
						: '' + vid + '?enablejsapi=1&playerapiid=ytplayer';
			swfobject.embedSWF( pUrl, pen, w, h, '8', null, null, { allowScriptAccess: 'always' }, { id: vid });
	onClick: function(ev) {
		var t = resolveTarget(ev || window.event);
		var args = t.getAttribute('args');, 'youtubePlay',args.readMacroParams(), null, args);
	setupData: function(aus,tstn,ats,tl,vid) {
		if (!tl) {
			var evid = document.getElementById(vid);
			if (!evid.nextSibling)
			tl = insertAfter(evid.nextSibling,document.createElement('span'));
		aus.textLocation = tl;
		var tstext = store.getTiddlerText(tstn);
		if (tstext == null)
			return displayMessage("Tiddler '" + tstn + "' not found");
		var tsls = tstext.split('\n');
		for (var i=0; i < tsls.length; i++) {
			var tsl = tsls[i];
			if (aus.text && tsl.startsWith('|')) { // build timing array from table of lines: |time|Text|
				var lps = tsl.split('|');
				if (lps.length > 2) {
					var it = parseInt(lps[1]);
					if (it > 0) ats[it] = lps[2];
			else if (aus.time) {
				if (!aus.transcript) {
					aus.transcript = tstn;
					aus.time = {};
				var tsde = aus.textLocation; //document.getElementById(tsDiv);
				if (tsde == null)
					return displayMessage("text-location not found"); //"Element " + tsDiv + " not found");
				var lid = vid + '_' + i;
				var lel = createTiddlyElement(tsde,'a',lid,null,tsl, { 'href': 'javascript:;' });
				aus.time[lid] = { text: tsl };
				lel.onclick = function(ev) {
					var me = resolveTarget(ev || window.event);
					var player = document.getElementById(vid);
					aus.time[].time = player.getCurrentTime();
					aus.changes = true;
					displayMessage(aus.time[].time + ": " + aus.time[].text);
	updateTiming: function(aus) {
		var tta = aus.time;
		var atb = [];
		for (ali in tta) {
			var time = tta[ali].time;
			var text = tta[ali].text;
			if (time && time > 0) {
				var tlps = text.split('|');
				if (tlps.length == 4) {
					tlps[1] = time;
				} else
					atb.push('|' + time + '|' + text + '|');
			} else
		var tstn = aus.transcript;
		if (tstn) {
			var tiddlerElem = story.getTiddlerField(tstn,'text');
			if (tiddlerElem) {
				tiddlerElem.value = atb.join('\n');
				displayMessage(tstn + " updated");
			} else
			aus.changes = false;
<<youtube tKQSlH-LLTQ -600>>
is something that should have better generic support. It should allow you to:
* arrange a list of tiddlers by drag-n-drop.
* build lists of tiddlers by selection (where of course the selected tiddlers are removed from the source lists).
An enhanced SiteMap (if not the default) should give feedback to the user before going to the server to retrieve a tiddler. The SiteMap code might be JIT-loaded in the same manner as PageProperties.

If you are logged in, it might also include your set of subdomains as a higher level.
<html><iframe width="560" height="315" src="" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe></html>
a shameless attempt to promote giewiki by demonstrating a potential application, suggesting others and perhaps even inspiring some that I have not thought of. 
Technically, it is a mere facade for, offering only a more convenient URL. //I wonder if Google's link counting catches and disregards circular references.//
* Ward Curnningham, for inspiration
* Jeremy Ruston & the TiddlyWiki community, of course
* Eric Shulman for the InlineJavascriptPlugin (I never could figure out that regexp stuff).
* Simon Baird for the MPTW template.
* Bauwe Bijl for feedback and a deployment video tutorial.
<<image 'RestingSeals.jpg' > 100%>>

Darlingside & Heather Maloney

Joni's egen langt senere version.

Joni, m.fl.
Release 1.16 lets you easily define your own kinds of tiddlers, with separate view and edit templates. This means that you can finally make full use of the custom fields support in giewiki. The details are described in the documentation of the [[tiwinate|tiwinate (macro): Tiddler With Named Template]] macro. Also, it will support opening any tiddler using any template, simply through the use of the template/tiddler link pattern. This works also for the URL (permalink). Similarly for the link to open the generic field editor; it is changed from fields:Tiddler to fields/Tiddler in order to make the permalink work. Plus, it makes for a nicer URL.
!Release 1.16.1
Those who use custom tiddler templates now have a new option: The edit macro support for checkbox & select (multiple choice), eg:
{{{<<edit model select "(pick)|501|511">>}}}
{{{<<edit discontinued checkbox>>}}}
For consistency with the edit macro & code sharing, the input macro macro has changed: Order of 1st two arguments switched, as in 
{{{<<input anonymous select "javascript:config.accessTypes">>}}}
Options for the select may be specified like:
* {{{(gender)|male|female}}} [paranthesis indicating prompt, if no default] 
* {{{male|male|female}}} [no parenthesis around the 1st element indicates the default]
* {{{javascript:genderList()}}}"
The latter form can be used if the list is variable: the function must return a string with the same syntax as when a literal choice string is given.
This release also adds a new advanced option: "List previous version(s) of tiddlers you just edited", which defaults to true (ie. like it used to be).
!Release 1.16.3
* The ViewTemplate and EditTemplate have changed to include a triangular button on the left, allowing the user to collapse a tiddler to show only the title. Beware that this depends on changes to the StyleSheetLayout as well, so pages that have changes to either may need to be modified.
* The fields editor now allows you to specify the ''space'' field to indicate an alternative to the default 'tiddlerDisplay' for where a specific tiddler is rendered. Alternatives (each depending on a div element in the PageTemplate having the corresponding id) are:
** wideArea: The space above both the middle and right colums.
** headerArea: The space above all 3 columns where hitherto only the page title and subtitles have been displayed.
** sidebar and leftSidebar: Below the existing elements of the two sidebars. This doesn't work terribly well unless you also change the viewtemplate field to  TextOnlyTemplate, thus removing both the title, toolbar and other features. If you do, you will of course loose the normal access to editing it and changing fields; you would have to use the trick of creating a temporary {{{[[fields/TiddlerName]]}}} link through which you can access the fields editor.
* The edit macro now supports  "name [n] text", "name [n] ckeckbox" and "name [n] select values" where n is a number indicating how many values can be entered; it will create an input control for each.
* The editFields macro uses this to allow custom fields to have lists of values rather than just a single value (which may or may not be appropriate).
* I've finally fixed the feature whereby (as in classic TiddlyWiki) the 'Special' tab of the index is rendered so as to show which special ('shadow' in TW-terms) tiddlers have been modified on this page.
The reason for the collapse button is to improve the user experience in two ways: Rather than having to scroll down a long story column, collapsing tiddlers helps navigating the page for users who are not familiar with the jump button. Also, collapsing a tiddler rather than closing it helps you see what you have read and what you haven't.
The reason for the space attribute is to allow wide fixed-format tiddlers to be rendered in a manner that makes them easier to read, not overlapping the right column or with internal scroll bars.
If you make changes and hit 'delete versions' without first saving them, your changes are lost.
Giewiki inherits from TiddlyWiki the support for installing plugins, that can add features or modify behaviour, style or layout, etc. 
* Filter out NoAccessMessage if it doesn't apply
* When one group is defined as editors of a page, DefineGroup should show the members by default. 
* Allow all-lowercase aliases for page address (..and other aliasing features..?)
* customizable MessageToMail template - //done//
* Library import from an external giewiki site should be smart enough to always retrieve the content using the '?xsl=' query.
* In the hosted environment, the admin should have a link to in stead of /_ah/admin
* Improvements to 'paste tiddler': Allow pasting with a different title [use case: clone & fork]
* I should do a page template optimized for blogs: Automatic management of the DefaultTiddlers (& MainMenu?).
* Add tags to RecentChanges. And allow filters to be defined.
* Diff between current edit and latest (or earlier version).
* Save & delete prior versions in one operation.
* A macro to show the time since page was loaded - updated 1/s.
* Tiddler attribute: @notVersioned
* The options in the sidebar panel (RegExpSearch, etc.) should link to help tiddlers available server-side.
* Tiddlers in the 'Missing' index should, when opened, list the tiddlers that ref them.
* Improved handling of session timeout.
* Preview of changes done.
* preview button in PageSetup better be named 'test', as it behaves differently from preview in the normal edit dialog.
* distinguish Common tweaks & common tasks
* The DefaultTiddlers should have a way to indicate (a separator?) that some tiddlers should be listed in collapsed mode.
* The PageProperties should be visible but read-only to those who cannot change it. Or at least part of it.
* file import should pick a unique name, exclude GiewikiAdaptor
* PageTemplates should be versioned (admin: status/update/apply/force)
* Improve SiteMap rendering in IE
* Make /some-path link to the page at /some-path, if it exists.
* Edit option: Don't make my edit current (just yet)
* DefaultEditTemplate should show tags if there are any already.
* Include a readme tiddler that goes away if you register.
* Detach imported tiddler, making a local copy.
* bugfix templates from external imports
* load-on-demand
This release adds two new features:
* The "''deprecated''" tiddler attribute lets you specify that a tiddler should not normally be loaded with the page, but only on specific demand: via links or via the new 'deprecated' tab of the index, which is only present in edit mode.
* The timing facilities allow you to schedule a date or a specific time (GMT) when a tiddler should be added to / removed from MainMenu or DefaultTiddlers, removed from the page ("deprecated"), or a different version should become the current. This is done using special tags, as documented in the tiddler editor help menu.
Also, file upload (which was broken in 1.12.3) has been fixed, and timely release of edit locks has been improved.
* It is actually all tags that start with a @ character, that are now hidden when you don't have edit rights.
* Another minor change is that tiddlers that don't have tags, do not show the 'no tags' box.
* The right sidebar and the Page properties of pages you own now show your login name, not your pen name.
* Admins can now delete or change the properties of any page.
Fixes 4 issues with the Import facility:
* When import failed, it would not report the cause.
* Pages that had {{{<br>}}} elements, like, would fail to import.
* When no 'other..' source was defined in AdvancedOptions, it would prompt for a URL only the first time 'other..' was clicked.
* Timestamps and custom fields were not imported
Also fixes issue 11, a unicode bug
is still hot out of the oven. Once again, there are a few new features, several bugfixes and hopefully not any new bugs.

The new features are:
* Page-level tags can be defined, which show up in the SiteMap, and are used to support the other new feature:
* A page template facility, which lets you declare that a Page is to be used as a template. Doing so, a snapshot of the tiddlers are collected and made available as a page template, that can be included in other tiddlers via Page properties. The reason for the snapshot mechanism is so that you can continue to refine your template and only publish a new version when its tested and ready.

 The tiddler import facitlity has now been further refined and fully integrated into the Page properties dialog via four buttons, that presents Library tiddlers from the following sources:
* Static XML files included in your installation (currently, there is only one, [[YouTube.xml|]]), but you can add more.
* Your own local giewiki site, specifically any page that has been tagged //library//.
* which is intended as a place to share plugins with other giewiki users.
* Other: You can either configure the sources (which may external web resources or local files) via AdvancedOptions or be prompted for a URL.

The importTiddlers macro still exists, but it is no longer included in a shadow tiddler via the edit menu.

Version 1.6 also does change one rather central bahaviour: Previously, when a tiddler was not found on the browser side, it would check the server only if you tried to create it. Version 1.6 will check the server whenever it is asked to open it or even to create a link to it. This latter part may cause a few too many roundtrips to the server in some cases, particularly navigating the More tab (I'll have to work on that).

Anyway, get it at
Recent events in Britain have stressed the importance of dialog in society. The more dialog, the better.  And the better the tools we have for this dialog, the better.
Known limitations of App Engine as served through Google Apps:
* You cannot have a naked domain URL, like You have to write (or else your browser will do it for you).
* There is no support for https, as there is on
* Automatic subdomains are not supported.
The subdomain feature (a.k.a. //My projects//) which is offered via //my profile//, allows you to have isolated subsites on the same appspot domain. It doesn't work well with a local installation because of name resolution problems, so for local applications I recommend using separate data stores, as described in Obviously, that will not allow you to use the new facility for cut/paste of tiddlers between subdomains, as that would require a different (client-side) implementation, that browsers are unhappy to allow for security reasons.
Was finally released today. The primary new features are:
* [[Diff viewing]]
* [[User profiles]]
* [[Read-only view options]]
Version 1.4.1 is a bugfix release, that fixes issues with the sitemap and the state of the new read-only options.
The lofty ambition of giewiki is to empower people with respect to how they interact in cyberspace. They should be able to use the appropriate pattern for whatever purpose they have, whether it be one-to-many, many-to-one or many-to-many communication (on-to-one is well served by email, this will probably stay that way).

An anti-pattern that I have seen several times within the (IT services) company I work for is the use of Microsoft Excel to publish opt-in lists or similar information-gathering needs. Google App Engine (and many other web server frameworks) offer the facilities for doing it the technically correct way, but they are not nearly as easy to use as to enable the non-techical user to do things the best way. Lotus Notes or Microsoft SharePoint are supposed to make it easier, but they are proprietary, expensive and complicated.
I'm currently working on server-side extensibility. The first part was the [[includes tag]]. The mechanism for specifying inclusion of a server-generated tiddler is that it must reside on a page located within the /_python/ path. This allows the creation of server-side code to be controlled using the existing access control mechanism. Additionally, if the tiddler is tagged HttpMethod, it is not included directly. In stead, it's name is added to the HttpMethods special tiddler and executed when the client issues a http request specifying the name as method.
The "requires" attribute is a custom field that you may add to a tiddler to indicate that certain other tiddlers need to accompany it. The value is a list of tiddler names, using {{{[[}}} double square brackets{{{]]}}} for separation if necessary, that tells giewiki which other tiddlers are needed. It is currently used in two places:
* When importing tiddlers from a library, checking a tiddler which requires another, will check that as well.
* When lazyLoading a systemConfig tiddler, typically in [[On-demand-loading macros]], it tells giewiki what other tiddlers are also needed.
<<image InvertedSwimming.jpeg < 39% >> @@font-size:1.2em;This guy (//goose, actually//) in my realspace neighborhood has clearly spent his (//or should that be ''her''//) summer developing techniques for ''inverted swimming''. Whether it was inspired by Loudon Wainwright's [[Swimming Song]] or a hint to higher powers of his frustration with the excessive amount of rain we've had - he absolutely refused to say.

Although I could use the exercise too, I found it wiser to just continue working on giewiki [[Release 1.14|Release 1.14.0: Useability]].@@
To implement giewiki on your own computer (Windows, Mac or Linux), you need the source code which lives

But if you are not a developer, you should probably just download the latest release, which is [[giewiki-1.18.6|]]

To get your own wiki site up and running on giewiki, read the DeploymentGuide
|9.596|''Me and my uncle''|
|12.516|came riding down|
|14.002|From Colorado|
|15.71|West Texas bound|
|18.228|And we stopped off in Santa Fe|
|20.921|It being a place -|
|23.429|about half way|
|26.494|And besides it was the ''hottest'' part of the day|

|31.556|We led our ponies into a stall|
|35.596|Went to the bar, boys|
|37.454|bought drinks for all|
|39.172|Two days in the saddle|
|41.355|my //body// hurt|
|43.048|It being summer -|
|45.395|I took off my shirt,|
|47.16|and tried to wash off some of that dusty dirt|

|53.99|West Texas cowboys all over town|
|56.587|With gold and silver|
|58.421|they’re loaded down|
|60.534|Just in from round-up -|
|63.042|it seemed a shame...|
|64.482|And so my uncle starts a friendly game:|
|69.312|High-low jacks and the winner takes the gains|

|74.745|From the beginning|
|76.487|uncle starts to win|
|78.321|Them Texas cowboys they was mad as sin|
|82.361|Some say he’s cheating -|
|83.731|but that can’t be|
|85.937|’Cuz my uncle -|
|87.442|he's honest as me|
|90.488|And I'm as honest as a Denver girl can be|

|95.457|One of them cowboys, he starts to draw,|
|99.544|I grabbed a bottle, slapped him on the jaw|
|103.584|I shot me another - he won't grow old.|
|107.439|In the confusion, uncle grabbed the gold|
|113.522|And we high-tailed it down to Mexico.|

|119.699|Now God bless cowboys|
|120.803|and God bless gold|
|124.51|God bless my uncle|
|130.127|and rest his soul.|
|133.445|He taught me well boys|
|135.789|Taught me all I know.|
|138.711|Taught me so well that I grabbed that gold,|
|143.25|And I left him lying there|
|145.55|I left him lying there|
|150.0|by the side of the road.|
|153.0| |
<<image < >> This morning I managed to get as close as my Tamron SP 70-200 can focus. Direct sunlight allowed me to go f/20 at 1/320s (handheld) and still keep it at ISO 800. I used a 2x teleconverter, and cropped this only as much as I almost always do with the 6D, using only it's central focus point. It doesn't look quite as sharp as I had hoped, but I'm not sure how much it is due to f/20 and how much to shake.
Help on git: [[atlassian|]]
<<youtube P_NpxTWbovE>>
When receiving a referral to a 404 or non-existing tiddler, I should perhaps have a list of moved or deleted content to check against, so as to be able to present a more helpful message.
''The easiest way'' to use the ''tiwinate'' macro is without any arguments, as already found in the EditingMenu special tiddler of giewiki 1.16. The effect is a list of command buttons, one for each of the tiddlers on the page that satisfy two conditions:
* It has the attribute tag 'tiddlerTemplate'
* It has a title that contains the string 'EditTemplate' preceded by one or more characters. 
If so, you will get a button with the label 'new x', with x being the string that precedes 'EditTemplate' in the title. Clicking that button will produce a new tiddler edit dialog that uses the tiddler as the HTML template in place of the default EditTemplate. It will also implicitly add the field 'edittemplate' with a value specifying the specific tiddler, to be used as a custom edit template. In addition, it will look for a tiddler named with the same string followed by 'ViewTemplate'. If found, it will also add the field 'viewtemplate' with a value specifying that tiddler. Additional fields present on the template tiddler will be copied to the new tiddler.

The use of //tiwinate// in the EditingMenu means that you can just go ahead and define a pair of templates, and immediately get a new button in the edit sidebar on the right, that will let you instantiate your template. For a brief silent video demo, see or [[Custom tiddler templates (video)]].

''Alternatively, tiwinate'' can be use with the following arguments (square brackets indicate //optional// arguments):
{{{"label" template [tiddler|this|""] [className] [condition][fields]}}}
Used this way, the specified label is used for the button, while //template// specifies a tiddler to be used for rendering another tiddler, which is specified by the third argument:
* [tiddler|this|""] (understood as //''either''// //tiddler//, //this// or an empty string), where
** //tiddler// names the specific tiddler to be rendered.
** //this// indicates that the tiddler being rendered is to be the subject of the alternative rendering specified by the named template (use case: a third rendering mode for tiddlers).
** "" indicates that a new tiddler is to be created using the named edit template.
* [className] specifies a CSS class to be used for the button (when not specified (or ""), the default depends on where the macro is used).
* [condition] is interpreted as a javascript expression (e.g. "!readOnly"), the value of which controls the presence of the button.
* [fields] is a string of name:value pairs indicating defaults for custom fields (when creating a new tiddler).

As an alternative to writing {{{<<tiwinate "label" template tiddler>>}}}, you can also write a pretty-link of the form {{{[[label|template/tiddler]]}}} - in other words, the code that renders (and opens) links will look specifically for the //template/tiddler// pattern, again with the reqirement that //template// names a tiddler on the page that has the 'tiddlerTemplate' tag. This pattern is also supported in the # part of the URL, meaning that you can, for instance, mail a link to a page with a //template/tiddler// pattern after the #, prompting the receiver to fill in specific information.
There are two aspects to cloud computing, that may or may not appeal to you:
* The outsourcing of management responsibility.
* The pervasive availablility, that becomes possible with an easy-to-judge set of risks, compared with opening up a VPN tunnel into your intranet.
A set of links to the documentation, still work in progress.
If you tag a tiddler '''includes''', the server will interpret it as a list of tiddlers (one per line), that you want to include in the containing document. They can come from anywhere on the site.
If you also tag the tiddler '''current''', you will be sure get the version of the tiddlers that was current at the time the inclusion list is saved - not any later versions; otherwise, if an included tiddler is changed, you will get the new version.
Tip #1:
* To debug the browser side (assuming you have a browser/debugger that understands the javascript debugger statement): Adding the query string ''?debugger'' to the browser address will cause giewiki to execute the debugger statement at the beginning of the main() method.

Tip #2:
* If you are using the App Engine SDK, you can browse the data store via  the ''/_ah/admin'' URL. If you are using a hosted site, you (and other admins you appoint) can browse the data store via

Tip #3:
* If you are writing server-side code without a debugger, you can use ''self.Trace(text)'' to leave clues as to what path your code takes. The method adds the text to a list of trace strings that are added as an entry into the LogEvent table when the method returns. This is normally disabled unless you add the ?trace=1 parameter to a browser URL.

Tip #4:
* To disable the inclusion of content that has been added using the ImportTiddlers feature, add the '''?disable=*''' query parameter to the page address - or ''?disable=//pagespec//'' if you have multiple sources and only want to disable one.
<<youtube LnqukhMSnsw -600,60% >>
Rider in the rain
Sings Joni's [[urge for going|]].
<html><object width="425" height="344"><param name="movie" value=""></param><param name="allowFullScreen" value="true"></param><param name="allowScriptAccess" value="always"></param><embed src="" type="application/x-shockwave-flash" allowfullscreen="true" allowScriptAccess="always" width="425" height="344"></embed></object>
<object width="425" height="344"><param name="movie" value=""></param><param name="allowFullScreen" value="true"></param><param name="allowScriptAccess" value="always"></param><embed src="" type="application/x-shockwave-flash" allowfullscreen="true" allowScriptAccess="always" width="425" height="344"></embed></object>
Traditional websites do not bother to prefetch linked content at all. TiddlyWiki, as we know, prefetches all the linked content that you decide should reside on the same page. Which is fine, up to a point, where the load time and other delays start to become apparent.

I don't know of any system that tries to do the optimum compromise, but ''giewiki'' has taken the first step in this direction by letting the author apply the lazyLoad attribute to a tiddler. When you do this, the existence, modification time and tags of a tiddler are known when the page renders, so that it will appear just like other tiddlers in the index and when links to it are rendered. But the text is not brought in and &mdash; in the release 1.15 implementation &mdash; not searchable until a the tiddler is opened (or otherwise needed).

The rules change somewhat if you also apply the [[excludeLists]] attribute. In this case, knowledge of the tiddler is not present upon page load, but in stead, the rendering script will (attempt to) fetch the tiddler when it needs to render a link to it. With potentially many links, this can of course delay the rendering of a tiddler considerably. The remedy in release 1.15 is far from perfect, it is to keep a list of tiddler names that have been requested in vain from the server. The purpose of the list is  to avoid attempting to fetch the tiddler a second time. For now, this regrettably has the consequence, that some tiddlers are reported not to exist even though they actually do. This can apply to tiddlers that have the lazyLoad or deprecated attributes.
!!Future enhancement
In the perfect world of web pages that see a lot of traffic, the author should not have to be concerned with whether a tiddler should be loaded early or just-in-time. A future release of ''giewiki'' may try to balance the problem intelligently by collecting statistics on how often a tiddler is actually rendered relative to how many hits the page receives. This information, together with the total amount of content on a page, would factor into the decision of whether to deliver a tiddler on page load. A missing piece in the picture is of course that of full-text search which ought to give the same results whether or not a tiddler is loaded early or late - a delay in listing the still-not-loaded tiddlers is acceptable, but it should still be automatic by default, if not entirely transparent.

The ultimate benefit of such a design would be a situation where the author does not have to be concerned with structuring the content into reasonably sized pages and chapters. Often, the natural unit of content is far smaller than what the web browser can easily handle, while the total amount of content isn't.
<html><iframe width="560" height="315" src="" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe></html>
Version 1.4 includes the ability to generate a display of the differences between any two versions of a tiddler, available by clicking the version number in the prior versions list.
<html><iframe width="560" height="315" src="" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe></html>
giewiki runs on Google's virtually free [[App Engine|]] service, which frees you from any concerns regarding management and backup of the server ([[cloud computing]]). Potential developers should be aware that giewiki is currently implemented in Python, although Java is also supported by App Engine. If you don't intend to modify the server-side, the only implication to you is the need for a computer that can run Python in order to [[deploy it|DeploymentGuide]]. 
Python is the programming language that is used for the server-side of giewiki. Since it's an interpreted language, you will need it be installed in order to run giewiki.
If you use a Mac or a Linux machine, you will already have have Python installed; if you are on Windows, you will need to install Python 2.7, which is free software from [[|]]. Oh, and if your are only just thinking of getting your feet wet in terms of programming, Python is a good place to start. It is, more than any language I know, designed to be easy to read, yet powerful.
Background: #f4f3f2
Foreground: #000
PrimaryPale: #8cf
PrimaryLight: #18f
PrimaryMid: #04b
PrimaryDark: #014
SecondaryPale: #ffc
SecondaryLight: #fe8
SecondaryMid: #db4
SecondaryDark: #841
TertiaryPale: #eee
TertiaryLight: #ccc
TertiaryMid: #999
TertiaryDark: #666
Error: #f88
body {background:[[ColorPalette::Background]]; color:[[ColorPalette::Foreground]];}

a {color:[[ColorPalette::PrimaryMid]];}
a:hover {background-color:[[ColorPalette::PrimaryMid]]; color:[[ColorPalette::Background]];}
a img {border:0;}

h1,h2,h3,h4,h5,h6 {color:[[ColorPalette::SecondaryDark]]; background:transparent;}
h1 {border-bottom:2px solid [[ColorPalette::TertiaryLight]];}
h2,h3 {border-bottom:1px solid [[ColorPalette::TertiaryLight]];}

.button {color:[[ColorPalette::PrimaryDark]]; border:1px solid [[ColorPalette::Background]];}
.button:hover {color:[[ColorPalette::PrimaryDark]]; background:[[ColorPalette::SecondaryLight]]; border-color:[[ColorPalette::SecondaryMid]];}
.button:active {color:[[ColorPalette::Background]]; background:[[ColorPalette::SecondaryMid]]; border:1px solid [[ColorPalette::SecondaryDark]];}

.cxtoggle {color:[[ColorPalette::TertiaryMid]];}
.cxtoggle:hover {color:[[ColorPalette::Foreground]];}

.header {background:[[ColorPalette::PrimaryMid]];}
.headerShadow {color:[[ColorPalette::Foreground]];}
.headerShadow a {font-weight:normal; color:[[ColorPalette::Foreground]];}
.headerForeground {color:[[ColorPalette::Background]];}
.headerForeground a {font-weight:normal; color:[[ColorPalette::PrimaryPale]];}

border-left:1px solid [[ColorPalette::TertiaryLight]];
border-top:1px solid [[ColorPalette::TertiaryLight]];
border-right:1px solid [[ColorPalette::TertiaryLight]];
.tabUnselected {color:[[ColorPalette::Background]]; background:[[ColorPalette::TertiaryMid]];}
.tabContents {color:[[ColorPalette::PrimaryDark]]; background:[[ColorPalette::TertiaryPale]]; border:1px solid [[ColorPalette::TertiaryLight]];}
.tabContents .button {border:0; padding: 0.2em 0.4em;}

#sidebar {}
#sidebarOptions input {border:1px solid [[ColorPalette::PrimaryMid]];}
#sidebarOptions .sliderPanel {background:[[ColorPalette::PrimaryPale]];}
#sidebarOptions .sliderPanel a {border:none;color:[[ColorPalette::PrimaryMid]];}
#sidebarOptions .sliderPanel a:hover {color:[[ColorPalette::Background]]; background:[[ColorPalette::PrimaryMid]];}
#sidebarOptions .sliderPanel a:active {color:[[ColorPalette::PrimaryMid]]; background:[[ColorPalette::Background]];}

.wizard {background:[[ColorPalette::PrimaryPale]]; border:1px solid [[ColorPalette::PrimaryMid]];}
.wizard h1 {color:[[ColorPalette::PrimaryDark]]; border:none;}
.wizard h2 {color:[[ColorPalette::Foreground]]; border:none;}
.wizardStep {background:[[ColorPalette::Background]]; color:[[ColorPalette::Foreground]];
border:1px solid [[ColorPalette::PrimaryMid]];}
.wizardStep.wizardStepDone {background:[[ColorPalette::TertiaryLight]];}
.wizardFooter {background:[[ColorPalette::PrimaryPale]];}
.wizardFooter .status {background:[[ColorPalette::PrimaryDark]]; color:[[ColorPalette::Background]];}
.wizard .button {color:[[ColorPalette::Foreground]]; background:[[ColorPalette::SecondaryLight]]; border: 1px solid;
border-color:[[ColorPalette::SecondaryPale]] [[ColorPalette::SecondaryDark]] [[ColorPalette::SecondaryDark]] [[ColorPalette::SecondaryPale]];}
.wizard .button:hover {color:[[ColorPalette::Foreground]]; background:[[ColorPalette::Background]];}
.wizard .button:active {color:[[ColorPalette::Background]]; background:[[ColorPalette::Foreground]]; border: 1px solid;
border-color:[[ColorPalette::PrimaryDark]] [[ColorPalette::PrimaryPale]] [[ColorPalette::PrimaryPale]] [[ColorPalette::PrimaryDark]];}

.wizard .notChanged {background:transparent;}
.wizard .changedLocally {background:#80ff80;}
.wizard .changedServer {background:#8080ff;}
.wizard .changedBoth {background:#ff8080;}
.wizard .notFound {background:#ffff80;}
.wizard .putToServer {background:#ff80ff;}
.wizard .gotFromServer {background:#80ffff;}

#messageArea {border:1px solid [[ColorPalette::SecondaryMid]]; background:[[ColorPalette::SecondaryLight]]; color:[[ColorPalette::Foreground]];}
#messageArea .button {color:[[ColorPalette::PrimaryMid]]; background:[[ColorPalette::SecondaryPale]]; border:none;}

.popupTiddler {background:[[ColorPalette::TertiaryPale]]; border:2px solid [[ColorPalette::TertiaryMid]];}

.popup {background:[[ColorPalette::TertiaryPale]]; color:[[ColorPalette::TertiaryDark]]; border-left:1px solid [[ColorPalette::TertiaryMid]]; border-top:1px solid [[ColorPalette::TertiaryMid]]; border-right:2px solid [[ColorPalette::TertiaryDark]]; border-bottom:2px solid [[ColorPalette::TertiaryDark]];}
.popup hr {color:[[ColorPalette::PrimaryDark]]; background:[[ColorPalette::PrimaryDark]]; border-bottom:1px;}
.popup li.disabled {color:[[ColorPalette::TertiaryMid]];}
.popup li a, .popup li a:visited {color:[[ColorPalette::Foreground]]; border: none;}
.popup li a:hover {background:[[ColorPalette::SecondaryLight]]; color:[[ColorPalette::Foreground]]; border: none;}
.popup li a:active {background:[[ColorPalette::SecondaryPale]]; color:[[ColorPalette::Foreground]]; border: none;}
.popupHighlight {background:[[ColorPalette::Background]]; color:[[ColorPalette::Foreground]];}
.listBreak div {border-bottom:1px solid [[ColorPalette::TertiaryDark]];}

.tiddler .defaultCommand {font-weight:bold;}

.shadow .title {color:[[ColorPalette::TertiaryDark]];}

.title {color:[[ColorPalette::SecondaryDark]];}
.subtitle {color:[[ColorPalette::TertiaryDark]];}

.toolbar {color:[[ColorPalette::PrimaryMid]];}
.commentToolbar {color:[[ColorPalette::PrimaryMid]];}
.toolbar a {color:[[ColorPalette::TertiaryLight]];}
.commentToolbar a {color:[[ColorPalette::TertiaryDark]];}
.selected .toolbar a {color:[[ColorPalette::TertiaryMid]];}
.selected .commentToolbar a {color:[[ColorPalette::TertiaryDark]];}
.selected .toolbar a:hover {color:[[ColorPalette::Foreground]];}
.selected .commentToolbar a:hover {color:[[ColorPalette::Foreground]];}

.tagging, .tagged {border:1px solid [[ColorPalette::TertiaryPale]]; background-color:[[ColorPalette::TertiaryPale]];}
.selected .tagging, .selected .tagged {background-color:[[ColorPalette::TertiaryLight]]; border:1px solid [[ColorPalette::TertiaryMid]];}
.tagging .listTitle, .tagged .listTitle {color:[[ColorPalette::PrimaryDark]];}
.tagging .button, .tagged .button {border:none;}

.tagmenu {padding:0.2em 0.4em 0.2em 0.4em; font-weight:bold; color:[[ColorPalette::TertiaryMid]]}
.selected .tagmenu {color:black;}
.selected .tagmenu:hover {background-color:white;}

.footer {color:[[ColorPalette::TertiaryLight]];}
.selected .footer {color:[[ColorPalette::TertiaryMid]];}

.sparkline {background:[[ColorPalette::PrimaryPale]]; border:0;}
.sparktick {background:[[ColorPalette::PrimaryDark]];}

.error, .errorButton {color:[[ColorPalette::Foreground]]; background:[[ColorPalette::Error]];}
.warning {color:[[ColorPalette::Foreground]]; background:[[ColorPalette::SecondaryPale]];}
.lowlight {background:[[ColorPalette::TertiaryLight]];}

.zoomer {background:none; color:[[ColorPalette::TertiaryMid]]; border:3px solid [[ColorPalette::TertiaryMid]];}

.imageLink, #displayArea .imageLink {background:transparent;}

.annotation {background:[[ColorPalette::SecondaryLight]]; color:[[ColorPalette::Foreground]]; border:2px solid [[ColorPalette::SecondaryMid]];}

.viewer .listTitle {list-style-type:none; margin-left:-2em;}
.viewer .button {border:1px solid [[ColorPalette::SecondaryMid]];}
.tabContents .button {border:1px solid [[ColorPalette::TertiaryPale]];}
.tabContents .button:hover {border-color:[[ColorPalette::SecondaryMid]];}
.viewer blockquote {border-left:3px solid [[ColorPalette::TertiaryDark]];}

.viewer table, table.twtable {border:2px solid [[ColorPalette::TertiaryDark]];}
.viewer th, .viewer thead td, .twtable th, .twtable thead td {background:[[ColorPalette::SecondaryMid]]; border:1px solid [[ColorPalette::TertiaryDark]]; color:[[ColorPalette::Background]];}
.viewer td, .viewer tr, .twtable td, .twtable tr {border:1px solid [[ColorPalette::TertiaryDark]];}

.viewer pre {border:1px solid [[ColorPalette::SecondaryLight]]; background:[[ColorPalette::SecondaryPale]];}
.viewer code {color:[[ColorPalette::SecondaryDark]];}
.viewer hr {border:0; border-top:solid 1px [[ColorPalette::TertiaryDark]]; color:[[ColorPalette::TertiaryDark]];}
.viewer table { border: 0px }
.viewer td {border: 1px solid #fff;} .oddRow {color: #333; background: #ddd;} .evenRow { color: #222; background: #eee;} 
.oddRowComment {color: #332; background: #ddc;} .evenRowComment { color: #222; background: #eec;}
.oddRowMessage {color: #223; background: #dcf;} .evenRowMessage { color: #223; background: #def;}
.oddRowNote {color: #332; background: #dec;} .evenRowNote { color: #222; background: #efc;}

.highlight, .marked {background:[[ColorPalette::SecondaryLight]];}

.editor input {border:0px solid [[ColorPalette::PrimaryMid]];}
.editor textarea {border:0px solid [[ColorPalette::PrimaryMid]]; width:100%;}
.editorFooter {color:[[ColorPalette::TertiaryMid]];}

.commentArea {background:[[ColorPalette::Background]];}
.commentTD {background:[[ColorPalette::Background]];}
.btnReplies {border:0; margin-right: 0.5em}
.btnCommentTool {border:0; margin-right: 0.3em}

.redbutton { color: #cc0000 }
.redbutton:hover { color: #ff0000 }

* html .tiddler {height:1%;}

body {font-size:.75em; font-family:arial,helvetica; margin:0; padding:0;}

h1,h2,h3,h4,h5,h6 {font-weight:bold; text-decoration:none;}
h1,h2,h3 {padding-bottom:1px; margin-top:1.2em;margin-bottom:0.3em;}
h4,h5,h6 {margin-top:1em;}
h1 {font-size:1.35em;}
h2 {font-size:1.25em;}
h3 {font-size:1.1em;}
h4 {font-size:1em;}
h5 {font-size:.9em;}

hr {height:1px;}

a {text-decoration:none;}

dt {font-weight:bold;}

ol {list-style-type:decimal;}
ol ol {list-style-type:lower-alpha;}
ol ol ol {list-style-type:lower-roman;}
ol ol ol ol {list-style-type:decimal;}
ol ol ol ol ol {list-style-type:lower-alpha;}
ol ol ol ol ol ol {list-style-type:lower-roman;}
ol ol ol ol ol ol ol {list-style-type:decimal;}

fieldset { padding:0px 8px 4px 4px; }

.txtOptionInput {width:11em;}

#contentWrapper .chkOptionInput {border:0;}

.externalLink {text-decoration:underline;}

.indent {margin-left:3em;}
.outdent {margin-left:3em; text-indent:-3em;}
code.escaped {white-space:nowrap;}

.tiddlyLinkExisting {font-weight:bold;}
.tiddlyLinkNonExisting {font-style:italic;}

/* the 'a' is required for IE, otherwise it renders the whole tiddler in bold */
a.tiddlyLinkNonExisting.shadow {font-weight:bold;}

#mainMenu .tiddlyLinkExisting,
#mainMenu .tiddlyLinkNonExisting,
#sidebarTabs .tiddlyLinkNonExisting {font-weight:normal; font-style:normal;}
#sidebarTabs .tiddlyLinkExisting {font-weight:bold; font-style:normal;}
#sidebarTabs .button {margin:0em 0.2em;	padding:0.2em 0.3em; display:block;}

#headerArea { margin: 0.5em; }
.siteTitle {font-size:3em;}
.siteSubtitle {font-size:1.2em;}

#topRightCorner { position:absolute; top:0.5em;right:0.9em; font-size: 1.1em; text-align: right; }

#leftSidebar {position:absolute; left:0; width:10em; padding:0.5em 0.5em 0.5em 0.5em;}
#mainMenu {text-align:right; line-height:1.6em; font-size:1.1em;}

#sidebar {position:absolute; right:3px; width:16em; margin-top:1em; font-size:.9em;}
#sidebarOptions {padding-top:0em;}
#sidebarOptions a {margin:0em 0.2em; padding:0.2em 0.3em; display:block;}
#sidebarOptions input {margin:0.4em 0.5em;}
#sidebarOptions .sliderPanel {margin-left:1em; padding:0.5em; font-size:.85em;}
#sidebarOptions .searchButton {font-size: 1.11em;}
#sidebarOptions .sliderPanel a {font-weight:bold; display:inline; padding:0;}
#sidebarOptions .sliderPanel input {margin:0 0 .3em 0;}
#sidebarTabs .tabContents {width:15em; overflow:hidden;}

.wizard {padding:0.1em 1em 0em 2em;}
.wizard h1 {font-size:2em; font-weight:bold; background:none; padding:0em 0em 0em 0em; margin:0.4em 0em 0.2em 0em;}
.wizard h2 {font-size:1.2em; font-weight:bold; background:none; padding:0em 0em 0em 0em; margin:0.4em 0em 0.2em 0em;}
.wizardStep {padding:1em 1em 1em 1em;}
.wizard .button {margin:0.5em 0em 0em 0em; font-size:1.2em;}
.wizardFooter {padding:0.8em 0.4em 0.8em 0em;}
.wizardFooter .status {padding:0em 0.4em 0em 0.4em; margin-left:1em;}
.wizard .button {padding:0.1em 0.2em 0.1em 0.2em;}

#messageArea {position:fixed; top:2em; right:0em; margin:0.5em; padding:0.5em; z-index:2000; _position:absolute;}
.messageToolbar {display:block; text-align:right; padding:0.2em 0.2em 0.2em 0.2em;}
#messageArea a {text-decoration:underline;}

.tiddlerPopupButton {padding:0.2em 0.2em 0.2em 0.2em;}
.popupTiddler {position: absolute; z-index:300; padding:1em 1em 1em 1em; margin:0;}

.popup {position:absolute; z-index:300; font-size:.9em; padding:0; list-style:none; margin:0;}
.popup .popupMessage {padding:0.4em;}
.popup hr {display:block; height:1px; width:auto; padding:0; margin:0.2em 0em;}
.popup li.disabled {padding:0.4em;}
.popup li a {display:block; padding:0.4em; font-weight:normal; cursor:pointer;}
.listBreak {font-size:1px; line-height:1px;}

.listBreak div {margin:2px 0;}
.tabset {padding:1em 0em 0em 0.5em;}
.tab {margin:0em 0em 0em 0.25em; padding:2px;}
.tabContents {padding:0.5em;}
.tabContents ul, .tabContents ol {margin:0; padding:0;}
.txtMainTab .tabContents li {list-style:none;}
.tabContents li.listLink { margin-left:.75em;}
.tabContents .tiddler {padding:0.1em 0.5em 0.5em 0.5em}

#contentWrapper {display:block;}
#splashScreen {display:none;}

#displayArea {margin:1em 17em 0em 12em;}
#wideArea {margin:1em 1em 0em 12em;}

.toolbar {text-align:right; font-size:.9em; float:right }
.commentToolbar {text-align:left; font-size:.9em;}

.tiddler {padding:0em 1em 1em 0em;}

.missing .viewer,.missing .title {font-style:italic;}

.title {font-size:1.6em; font-weight:bold;}
.cxtoggle {width:1.0em; font-size:1.10em;}
.vttable td { padding: 0 0 0 0 }
.tdtoggle {width: 1.25em;}

.missing .subtitle {display:none;}
.subtitle {font-size:1.1em;}

.tiddler .button {padding:0.2em 0.4em;}
.tiddler .disabled {padding:0.2em 0.6em;}

.tagging {margin:0.5em 0.5em 0.5em 0; float:left; display:none;}
.isTag .tagging {display:block;}
.tagged {margin:0.5em; float:right;}
.tagging, .tagged {font-size:0.9em; padding:0.25em;}
.tagging ul, .tagged ul {list-style:none; margin:0.25em; padding:0;}
.tagClear {clear:both;}

.footer {font-size:.9em;}
.footer li {display:inline;}

.annotation {padding:0.5em; margin:0.5em;}

* html .viewer pre {width:99%; padding:0 0 1em 0;}
.viewer {line-height:1.4em; padding-top:0.5em;}
.viewer .button {margin:0em 0.25em; padding:0em 0.25em;}
.viewer blockquote {line-height:1.5em; padding-left:0.8em;margin-left:2.5em;}
.viewer ul, .viewer ol {margin-left:0.5em; padding-left:1.5em;}

.viewer table, table.twtable {border-collapse:collapse; margin:0em 0em; 0em; 0em; font-size:1.0em;}
.viewer tr {vertical-align: top; }

.viewer th, .viewer td, .viewer tr,.viewer caption,.twtable th, .twtable td, .twtable tr,.twtable caption {padding:3px;}
table.listView {font-size:0.85em; margin:0.8em 1.0em;}
table.listView th, table.listView td, table.listView tr {padding:0px 3px 0px 3px;}

.viewer pre {padding:0.5em; margin-left:0.5em; font-size:1.2em; line-height:1.4em; overflow:auto;}
.viewer code {font-size:1.2em; line-height:1.4em;}

.editor {font-size:1.1em;}
.editor input, .editor textarea {display:block; width:100%; font:inherit;}
.editorFooter {padding:0.25em 0em; font-size:.9em;}
.editorFooter .button {padding-top:0px; padding-bottom:0px;}

.fieldsetFix {border:0; padding:0; margin:1px 0px 1px 0px;}

.sparkline {line-height:1em;}
.sparktick {outline:0;}

.zoomer {font-size:1.1em; position:absolute; overflow:hidden;}
.zoomer div {padding:1em;}

.commentTable {width:100%; font-size:1.0em;}
.commentTable td {vertical-align:text-top;}
.commentArea {border:0px; width:100%; font:inherit;}
.commentToolbar { padding-bottom:5px;}
.replyTD { padding-left:1.25em }
.buttonftr {position:relative; top:0em; right:0em; }
.linkbutton { font-weight: bold }
.siteMapTags { color: #ff0000 }
a.fieldsLink { margin-left:10px; margin-bottom:8px;}

.diffout { font-size:1.0em; font-family: courier; }
.diffminus { background-color: #d0ffdd; color: blue; }
.diffplus { background-color: #ffd0dd; color: darkred; }
StyleSheet for use when a translation requires any css style changes.
This StyleSheet can be used directly by languages such as Chinese, Japanese and Korean which need larger font sizes.
body {font-size:0.8em;}
#sidebarOptions {font-size:1.05em;}
#sidebarOptions a {font-style:normal;}
#sidebarOptions .sliderPanel {font-size:0.95em;}
.subtitle {font-size:0.8em;}
.viewer table.listView {font-size:0.95em;}
		@media print {
		#mainMenu, #sidebar, #messageArea, .toolbar, #backstageButton, #backstageArea {display: none ! important;}
		#displayArea {margin: 1em 1em 0em 1em;}
		/* Fixes a feature in Firefox where print preview displays the noscript content */
		noscript {display:none;}
<div id='headerArea'>
<span class='siteTitle' refresh='content' tiddler='SiteTitle'></span>&nbsp;
<span class='siteSubtitle' refresh='content' tiddler='SiteSubtitle'></span>
<span id='topRightCorner' refresh='content' tiddler='TopRightCorner'></span>
<div id='leftSidebar'>
<div id='mainMenu' refresh='content' tiddler='MainMenu'></div>
<div id='leftBottom'></div>
<div id='wideArea'></div>
<div id='sidebar'>
<div id='sidebarOptions' refresh='content' tiddler='SideBarOptions'></div>
<div id='sidebarTabs' refresh='content' force='true' tiddler='SideBarTabs'></div>
<div id='displayArea'>
<div id='messageArea'></div>
<div id='tiddlerDisplay'></div>
<table width='100%' class='vttable'><tr valign='top'>
<td class='tdtoggle'>
<a class='cxtoggle button' title='collapse' href='javascript:;'>▼</a>
<a class='cxtoggle button' title='expand' href='javascript:;' style='display:none'>►</a></td>
<td><div class='toolbar' macro='toolbar [[ToolbarCommands::ViewToolbar]]'></div>
<div class='title' macro='view title'></div>
<div class='subtitle'><span macro='author'></span><span macro='view modified date "DD MMM YYYY" ", "'></span> <span macro='history'></span></div>
<div class='tagging' macro='tagging'></div>
<div class='tagged' macro='tags'></div>
<div class='viewer' macro='if config.options.chkListPrevious view versions wikified'></div>
<div class='viewer' macro='view text wikified'></div>
<div class='tagClear'></div>
<div class='comments' macro='comments'></div>
<table width='100%' class='vttable'><tr valign='top'>
<td class='tdtoggle'>
<a class='cxtoggle button' title='collapse' href='javascript:;'>▼</a>
<a class='cxtoggle button' title='expand' href='javascript:;' style='display:none'>►</a></td>
<td><div class='toolbar' macro='toolbar [[ToolbarCommands::EditToolbar]]'></div>
<div class='title' macro='view title'></div>
<fieldset><legend>Title</legend><div class='editor' macro='edit title'></div></fieldset>
<div macro='annotations'></div>
<fieldset><legend>Text</legend><div class='editor' macro='edit text'></div>
<table style='width:100%;'><tr><td><div class='commentToolbar' macro='toolbar [[ToolbarCommands::TextToolbar]]'></td><td align='right'><div class='toolbar' macro='toolbar [[ToolbarCommands::EditToolbar]]'></div></td></tr></table> </fieldset>
<fieldset id='preview' style='display:none'><legend>Preview</legend><div class='viewer' ></div></fieldset>
<fieldset id='tag' class='tagFrame'><legend>Tags & attributes</legend><div class='editor' macro='edit tags'></div><div class='editorFooter'><span macro='message views.editor.tagPrompt'></span><span macro='tagChooser'></span></div></fieldset>
<div class='editor' macro='edit text'></div>
<span class='tagFrame' > <div class='editor' macro='edit tags'></div></span>
<span class='commentToolbar' macro='toolbar [[ToolbarCommands::SpecialEditToolbar]]'></span>
<div class='history' ></div>
<div class='viewer special' macro='view text wikified'></div>
<div class='viewer' macro='view text wikified'></div>
<div class='toolbar' macro='toolbar [[ToolbarCommands::MiniToolbar]]'></div>
<div class='title' macro='view title'></div>
<div class='viewer' macro='view text wikified'></div>
<div class='tagClear'></div>
<div class='viewer' macro='view text wikified'></div>
<div class='tagClear'></div>
<table width='100%' class='vttable'><tr valign='top'>
<td class='tdtoggle'>
<a class='cxtoggle button' title='collapse' href='javascript:;'>▼</a>
<a class='cxtoggle button' title='expand' href='javascript:;' style='display:none'>►</a></td>
<td><div class='toolbar' macro='toolbar [[ToolbarCommands::MiniToolbar]]'></div>
<div class='title' macro='view title'></div>
<div class='viewer' macro='view text wikified'></div>
<div class='tagClear'></div>
tiddler|UserProfile|my profile|Edit my profile|
<<tabs chkPageSetup 
'PageProperties' 'Title, access, template/includes' 'js;editTiddlerHere;PageProperties;SpecialViewTemplate'
'MainMenu' 'The left column' 'js;editTiddlerHere;MainMenu'
'DefaultTiddlers' 'Middle column initial content' 'js;editTiddlerHere;DefaultTiddlers'
'ColorPalette' 'Color palette' 'js;editTiddlerHere;ColorPalette'
'StyleSheet' 'Custom styles' 'js;editTiddlerHere;StyleSheet'
'All..' 'Other special tiddlers' 'js;editTiddlerHere;SpecialTiddlers;SpecialViewTemplate'
!Common tweaks
* <script label="Remove">CommonTasks.RemoveText('[[PageSetup]]\n','MainMenu')&&CommonTasks.RemoveThisLi(place)</script> PageSetup from MainMenu (it is available from the editing menu).
* <script label="Remove">CommonTasks.RemoveText('[[PageSetup]]','DefaultTiddlers')&&CommonTasks.RemoveThisLi(place)</script> PageSetup from DefaultTiddlers.
macro|newJournal|"DD MMM YYYY" "journal"
tiddler|CreateNewPage|new page|Create new page or folder|p
tiddler|UploadDialog|upload file|Upload a local file|u
tiddler|PageSetup|page setup|Edit page properties and presentation|p
tiddler|File list|file list|list of uploaded files|f
tiddler|Recycle bin|recycle bin|List of 'deleted' tiddlers|r
<<recycleBin *>>
<<option chkAutoSyncAddress>> <<permaview>> - <script label="help" title="Information on address bar sync">story.displayTiddler(null, "Help on address bar sync features");</script>
<<option chkRegExpSearch>> Regular expression search
<<option chkCaseSensitiveSearch>> Case-sensitive search
<<option chkAnimate>> Enable animations
''Edit mode:''
<<option chkAutoSave>> Auto-save changes while editing
<<option chkInsertTabs>> Tab key inserts tab character
''//The server saves these and your// AdvancedOptions //in your profile//''
Please <<login>> to read this page.
<script>accessTypes = "all|edit|add|comment|view|none|"
var fn = formName(place);
forms[fn] = http.createPage({defaults:"get"});
if (fn != "CreateNewPage") {
	forms[fn].title = fn;
	forms[fn].address = CheckNewAddress(fn);
forms[fn].template = "normal";
forms[fn].title_changed = function(f,id,v) { f.title = v; setFormFieldValue(f,"address",CheckNewAddress(v)); }
|>|>|Title<br><<input title text 70>>|
|>|>|Subtitle<br><<input subtitle text 70>>|
|>|>|Address (<script label="end with a /">MakePathAFolder('address');</script> to make a folder)<br><<input address text 70>>|
|>|>|Access permissions|
|Group<br><<input group select javascript:accessTypes>>|Authenticated<br><<input authenticated select javascript:accessTypes>>|Anonymous<br><<input anonymous select "javascript:accessTypes">>|
|>|>|Template<br><<input template select javascript:availableTemplates() >>|
|>|>|<script label="Create new page" title="Create new page">OnCreatePage(http.createPage(GetForm(place)));</script><script>forms[formName(place)].controls['title'].focus();</script>|
var fn = formName(place);
var fn = formName(place);
forms[fn] = http.createPage({defaults:"get"}); // for updateAccess
forms[fn].address = window.location.pathname;
</script><html><div class='title'>Move this page</div></html>
|>|>|Address <br><<input address text 70>>|
|<<input redirect checkbox false>>Redirect current address|
|>|>|<script label="Move page" title="Move page to a different address">OnCreatePage(http.moveThisPage(GetForm(place)));</script><script>forms[formName(place)].controls['address'].focus();</script>|
var fn = formName(place);
listOfAllGroups = http.getGroups();
if (!listOfAllGroups.length)
	listOfAllGroups[0] = "(none defined)";
listOfAllGroups = listOfAllGroups.join('|');
forms[fn] = { 'updateaccess': true };
|Group<br><<input groupname select javascript:listOfAllGroups "" ListGroupMembers()>>|New group<br><<input name text 36>> <script label="Create" title="Create group">OnCreateGroup(http.createGroup(forms.DefineGroup));</script>|
|Members:|<html><div id="groupMemberList"></html>|
||>|Add user as member<br><<input user text 36>> <script label="Add" title="Add user">OnAddMember(http.addGroupMember(forms.DefineGroup));</script>|